Dirty Data, Task Four

Three excel files from 2015, 2016, and 2017 (named candy_2015, candy_2016, and candy_2017 respectfully) showing survey answers to questions related to enjoyment of certain candies were read, joined, and cleaned before being written into a csv file which has been read below. All three questionnaires asked for respondent’s ages however only 2016 and 2017 questionnaires asked for their gender and for the country and state/province the respondent was from. Respondent’s must have been given the questionnaires to fill in themselves as spellings are incredibly varied (e.g. “US”, “u.s.a.”, “united states”) and there are some rather interesting responses, especially under age (e.g. “old enough”) and country (e.g. “’murrika!”). From first glance, the candy names that have been asked about are vast and range from the full name to a guess (e.g. “Tolberone something or other”), this may lead to there not being great discrepancies in the results. Further “full sized candy bars” seems rather generic so it has been ignored when considering some of the questions.

Loading appropriate libraries

library(tidyverse)
library(readxl)
library(stringr)
library(here)
Warning: package ‘here’ was built under R version 4.1.3
here() starts at C:/Users/mahri/OneDrive/CodeClan/dirty_data_project/dirty_data_codeclan_project_mahri/dirty_data_task_4_mahri

Reading the clean data csv file.

candy_cleaned <- read_csv("../clean_data/candy_cleaned.csv")
Rows: 9349 Columns: 96
-- Column specification --------------------------------------------------------------------------
Delimiter: ","
chr (93): trick_or_treating, country, state_or_prov, gender, butterfinger, x100_grand_bar, ano...
dbl  (3): year, id_number, age

i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.

Using glimpse, head, and viewing the full files, I got an overview of the data, variables, types, and differences between the files.

head(candy_2015)
glimpse(candy_2016)
Rows: 1,259
Columns: 123
$ Timestamp                                                                                                                                   <dttm> ~
$ `Are you going actually going trick or treating yourself?`                                                                                  <chr> ~
$ `Your gender:`                                                                                                                              <chr> ~
$ `How old are you?`                                                                                                                          <chr> ~
$ `Which country do you live in?`                                                                                                             <chr> ~
$ `Which state, province, county do you live in?`                                                                                             <chr> ~
$ `[100 Grand Bar]`                                                                                                                           <chr> ~
$ `[Anonymous brown globs that come in black and orange wrappers]`                                                                            <chr> ~
$ `[Any full-sized candy bar]`                                                                                                                <chr> ~
$ `[Black Jacks]`                                                                                                                             <chr> ~
$ `[Bonkers (the candy)]`                                                                                                                     <chr> ~
$ `[Bonkers (the board game)]`                                                                                                                <chr> ~
$ `[Bottle Caps]`                                                                                                                             <chr> ~
$ `[Box'o'Raisins]`                                                                                                                           <chr> ~
$ `[Broken glow stick]`                                                                                                                       <chr> ~
$ `[Butterfinger]`                                                                                                                            <chr> ~
$ `[Cadbury Creme Eggs]`                                                                                                                      <chr> ~
$ `[Candy Corn]`                                                                                                                              <chr> ~
$ `[Candy that is clearly just the stuff given out for free at restaurants]`                                                                  <chr> ~
$ `[Caramellos]`                                                                                                                              <chr> ~
$ `[Cash, or other forms of legal tender]`                                                                                                    <chr> ~
$ `[Chardonnay]`                                                                                                                              <chr> ~
$ `[Chick-o-Sticks (we don’t know what that is)]`                                                                                             <chr> ~
$ `[Chiclets]`                                                                                                                                <chr> ~
$ `[Coffee Crisp]`                                                                                                                            <chr> ~
$ `[Creepy Religious comics/Chick Tracts]`                                                                                                    <chr> ~
$ `[Dental paraphenalia]`                                                                                                                     <chr> ~
$ `[Dots]`                                                                                                                                    <chr> ~
$ `[Dove Bars]`                                                                                                                               <chr> ~
$ `[Fuzzy Peaches]`                                                                                                                           <chr> ~
$ `[Generic Brand Acetaminophen]`                                                                                                             <chr> ~
$ `[Glow sticks]`                                                                                                                             <chr> ~
$ `[Goo Goo Clusters]`                                                                                                                        <chr> ~
$ `[Good N' Plenty]`                                                                                                                          <chr> ~
$ `[Gum from baseball cards]`                                                                                                                 <chr> ~
$ `[Gummy Bears straight up]`                                                                                                                 <chr> ~
$ `[Hard Candy]`                                                                                                                              <chr> ~
$ `[Healthy Fruit]`                                                                                                                           <chr> ~
$ `[Heath Bar]`                                                                                                                               <chr> ~
$ `[Hershey's Dark Chocolate]`                                                                                                                <chr> ~
$ `[Hershey’s Milk Chocolate]`                                                                                                                <chr> ~
$ `[Hershey's Kisses]`                                                                                                                        <chr> ~
$ `[Hugs (actual physical hugs)]`                                                                                                             <chr> ~
$ `[Jolly Rancher (bad flavor)]`                                                                                                              <chr> ~
$ `[Jolly Ranchers (good flavor)]`                                                                                                            <chr> ~
$ `[JoyJoy (Mit Iodine!)]`                                                                                                                    <chr> ~
$ `[Junior Mints]`                                                                                                                            <chr> ~
$ `[Senior Mints]`                                                                                                                            <chr> ~
$ `[Kale smoothie]`                                                                                                                           <chr> ~
$ `[Kinder Happy Hippo]`                                                                                                                      <chr> ~
$ `[Kit Kat]`                                                                                                                                 <chr> ~
$ `[LaffyTaffy]`                                                                                                                              <chr> ~
$ `[LemonHeads]`                                                                                                                              <chr> ~
$ `[Licorice (not black)]`                                                                                                                    <chr> ~
$ `[Licorice (yes black)]`                                                                                                                    <chr> ~
$ `[Lindt Truffle]`                                                                                                                           <chr> ~
$ `[Lollipops]`                                                                                                                               <chr> ~
$ `[Mars]`                                                                                                                                    <chr> ~
$ `[Mary Janes]`                                                                                                                              <chr> ~
$ `[Maynards]`                                                                                                                                <chr> ~
$ `[Mike and Ike]`                                                                                                                            <chr> ~
$ `[Milk Duds]`                                                                                                                               <chr> ~
$ `[Milky Way]`                                                                                                                               <chr> ~
$ `[Regular M&Ms]`                                                                                                                            <chr> ~
$ `[Peanut M&M’s]`                                                                                                                            <chr> ~
$ `[Blue M&M's]`                                                                                                                              <chr> ~
$ `[Red M&M's]`                                                                                                                               <chr> ~
$ `[Third Party M&M's]`                                                                                                                       <chr> ~
$ `[Minibags of chips]`                                                                                                                       <chr> ~
$ `[Mint Kisses]`                                                                                                                             <chr> ~
$ `[Mint Juleps]`                                                                                                                             <chr> ~
$ `[Mr. Goodbar]`                                                                                                                             <chr> ~
$ `[Necco Wafers]`                                                                                                                            <chr> ~
$ `[Nerds]`                                                                                                                                   <chr> ~
$ `[Nestle Crunch]`                                                                                                                           <chr> ~
$ `[Now'n'Laters]`                                                                                                                            <chr> ~
$ `[Peeps]`                                                                                                                                   <chr> ~
$ `[Pencils]`                                                                                                                                 <chr> ~
$ `[Person of Interest Season 3 DVD Box Set (not including Disc 4 with hilarious outtakes)]`                                                  <chr> ~
$ `[Pixy Stix]`                                                                                                                               <chr> ~
$ `[Reese’s Peanut Butter Cups]`                                                                                                              <chr> ~
$ `[Reese's Pieces]`                                                                                                                          <chr> ~
$ `[Reggie Jackson Bar]`                                                                                                                      <chr> ~
$ `[Rolos]`                                                                                                                                   <chr> ~
$ `[Skittles]`                                                                                                                                <chr> ~
$ `[Smarties (American)]`                                                                                                                     <chr> ~
$ `[Smarties (Commonwealth)]`                                                                                                                 <chr> ~
$ `[Snickers]`                                                                                                                                <chr> ~
$ `[Sourpatch Kids (i.e. abominations of nature)]`                                                                                            <chr> ~
$ `[Spotted Dick]`                                                                                                                            <chr> ~
$ `[Starburst]`                                                                                                                               <chr> ~
$ `[Sweet Tarts]`                                                                                                                             <chr> ~
$ `[Swedish Fish]`                                                                                                                            <chr> ~
$ `[Sweetums (a friend to diabetes)]`                                                                                                         <chr> ~
$ `[Tic Tacs]`                                                                                                                                <chr> ~
$ `[Those odd marshmallow circus peanut things]`                                                                                              <chr> ~
$ `[Three Musketeers]`                                                                                                                        <chr> ~
$ `[Tolberone something or other]`                                                                                                            <chr> ~
$ `[Trail Mix]`                                                                                                                               <chr> ~
$ `[Twix]`                                                                                                                                    <chr> ~
$ `[Vials of pure high fructose corn syrup, for main-lining into your vein]`                                                                  <chr> ~
$ `[Vicodin]`                                                                                                                                 <chr> ~
$ `[Whatchamacallit Bars]`                                                                                                                    <chr> ~
$ `[White Bread]`                                                                                                                             <chr> ~
$ `[Whole Wheat anything]`                                                                                                                    <chr> ~
$ `[York Peppermint Patties]`                                                                                                                 <chr> ~
$ `Please list any items not included above that give you JOY.`                                                                               <chr> ~
$ `Please list any items not included above that give you DESPAIR.`                                                                           <chr> ~
$ `Please leave any witty, snarky or thoughtful remarks or comments regarding your choices.`                                                  <chr> ~
$ `Guess the number of mints in my hand.`                                                                                                     <chr> ~
$ `Betty or Veronica?`                                                                                                                        <chr> ~
$ `"That dress* that went viral a few years back - when I first saw it, it was ________"`                                                     <chr> ~
$ `What is your favourite font?`                                                                                                              <chr> ~
$ `Please estimate the degree(s) of separation you have from the following celebrities [JK Rowling]`                                          <chr> ~
$ `Please estimate the degree(s) of separation you have from the following celebrities [JJ Abrams]`                                           <chr> ~
$ `Please estimate the degree(s) of separation you have from the following celebrities [Beyoncé]`                                             <chr> ~
$ `Please estimate the degree(s) of separation you have from the following celebrities [Bieber]`                                              <chr> ~
$ `Please estimate the degree(s) of separation you have from the following celebrities [Kevin Bacon]`                                         <chr> ~
$ `Please estimate the degree(s) of separation you have from the following celebrities [Francis Bacon (1561 - 1626)]`                         <chr> ~
$ `Which day do you prefer, Friday or Sunday?`                                                                                                <chr> ~
$ `Do you eat apples the correct way, East to West (side to side) or do you eat them like a freak of nature, South to North (bottom to top)?` <chr> ~
$ `When you see the above image of the 4 different websites, which one would you most likely check out (please be honest).`                   <chr> ~
$ `[York Peppermint Patties] Ignore`                                                                                                          <lgl> ~
glimpse(candy_2017)
Rows: 2,460
Columns: 120
$ `Internal ID`                                                                            <dbl> ~
$ `Q1: GOING OUT?`                                                                         <chr> ~
$ `Q2: GENDER`                                                                             <chr> ~
$ `Q3: AGE`                                                                                <chr> ~
$ `Q4: COUNTRY`                                                                            <chr> ~
$ `Q5: STATE, PROVINCE, COUNTY, ETC`                                                       <chr> ~
$ `Q6 | 100 Grand Bar`                                                                     <chr> ~
$ `Q6 | Anonymous brown globs that come in black and orange wrappers\t(a.k.a. Mary Janes)` <chr> ~
$ `Q6 | Any full-sized candy bar`                                                          <chr> ~
$ `Q6 | Black Jacks`                                                                       <chr> ~
$ `Q6 | Bonkers (the candy)`                                                               <chr> ~
$ `Q6 | Bonkers (the board game)`                                                          <chr> ~
$ `Q6 | Bottle Caps`                                                                       <chr> ~
$ `Q6 | Box'o'Raisins`                                                                     <chr> ~
$ `Q6 | Broken glow stick`                                                                 <chr> ~
$ `Q6 | Butterfinger`                                                                      <chr> ~
$ `Q6 | Cadbury Creme Eggs`                                                                <chr> ~
$ `Q6 | Candy Corn`                                                                        <chr> ~
$ `Q6 | Candy that is clearly just the stuff given out for free at restaurants`            <chr> ~
$ `Q6 | Caramellos`                                                                        <chr> ~
$ `Q6 | Cash, or other forms of legal tender`                                              <chr> ~
$ `Q6 | Chardonnay`                                                                        <chr> ~
$ `Q6 | Chick-o-Sticks (we don’t know what that is)`                                       <chr> ~
$ `Q6 | Chiclets`                                                                          <chr> ~
$ `Q6 | Coffee Crisp`                                                                      <chr> ~
$ `Q6 | Creepy Religious comics/Chick Tracts`                                              <chr> ~
$ `Q6 | Dental paraphenalia`                                                               <chr> ~
$ `Q6 | Dots`                                                                              <chr> ~
$ `Q6 | Dove Bars`                                                                         <chr> ~
$ `Q6 | Fuzzy Peaches`                                                                     <chr> ~
$ `Q6 | Generic Brand Acetaminophen`                                                       <chr> ~
$ `Q6 | Glow sticks`                                                                       <chr> ~
$ `Q6 | Goo Goo Clusters`                                                                  <chr> ~
$ `Q6 | Good N' Plenty`                                                                    <chr> ~
$ `Q6 | Gum from baseball cards`                                                           <chr> ~
$ `Q6 | Gummy Bears straight up`                                                           <chr> ~
$ `Q6 | Hard Candy`                                                                        <chr> ~
$ `Q6 | Healthy Fruit`                                                                     <chr> ~
$ `Q6 | Heath Bar`                                                                         <chr> ~
$ `Q6 | Hershey's Dark Chocolate`                                                          <chr> ~
$ `Q6 | Hershey’s Milk Chocolate`                                                          <chr> ~
$ `Q6 | Hershey's Kisses`                                                                  <chr> ~
$ `Q6 | Hugs (actual physical hugs)`                                                       <chr> ~
$ `Q6 | Jolly Rancher (bad flavor)`                                                        <chr> ~
$ `Q6 | Jolly Ranchers (good flavor)`                                                      <chr> ~
$ `Q6 | JoyJoy (Mit Iodine!)`                                                              <chr> ~
$ `Q6 | Junior Mints`                                                                      <chr> ~
$ `Q6 | Senior Mints`                                                                      <chr> ~
$ `Q6 | Kale smoothie`                                                                     <chr> ~
$ `Q6 | Kinder Happy Hippo`                                                                <chr> ~
$ `Q6 | Kit Kat`                                                                           <chr> ~
$ `Q6 | LaffyTaffy`                                                                        <chr> ~
$ `Q6 | LemonHeads`                                                                        <chr> ~
$ `Q6 | Licorice (not black)`                                                              <chr> ~
$ `Q6 | Licorice (yes black)`                                                              <chr> ~
$ `Q6 | Lindt Truffle`                                                                     <chr> ~
$ `Q6 | Lollipops`                                                                         <chr> ~
$ `Q6 | Mars`                                                                              <chr> ~
$ `Q6 | Maynards`                                                                          <chr> ~
$ `Q6 | Mike and Ike`                                                                      <chr> ~
$ `Q6 | Milk Duds`                                                                         <chr> ~
$ `Q6 | Milky Way`                                                                         <chr> ~
$ `Q6 | Regular M&Ms`                                                                      <chr> ~
$ `Q6 | Peanut M&M’s`                                                                      <chr> ~
$ `Q6 | Blue M&M's`                                                                        <chr> ~
$ `Q6 | Red M&M's`                                                                         <chr> ~
$ `Q6 | Green Party M&M's`                                                                 <chr> ~
$ `Q6 | Independent M&M's`                                                                 <chr> ~
$ `Q6 | Abstained from M&M'ing.`                                                           <chr> ~
$ `Q6 | Minibags of chips`                                                                 <chr> ~
$ `Q6 | Mint Kisses`                                                                       <chr> ~
$ `Q6 | Mint Juleps`                                                                       <chr> ~
$ `Q6 | Mr. Goodbar`                                                                       <chr> ~
$ `Q6 | Necco Wafers`                                                                      <chr> ~
$ `Q6 | Nerds`                                                                             <chr> ~
$ `Q6 | Nestle Crunch`                                                                     <chr> ~
$ `Q6 | Now'n'Laters`                                                                      <chr> ~
$ `Q6 | Peeps`                                                                             <chr> ~
$ `Q6 | Pencils`                                                                           <chr> ~
$ `Q6 | Pixy Stix`                                                                         <chr> ~
$ `Q6 | Real Housewives of Orange County Season 9 Blue-Ray`                                <chr> ~
$ `Q6 | Reese’s Peanut Butter Cups`                                                        <chr> ~
$ `Q6 | Reese's Pieces`                                                                    <chr> ~
$ `Q6 | Reggie Jackson Bar`                                                                <chr> ~
$ `Q6 | Rolos`                                                                             <chr> ~
$ `Q6 | Sandwich-sized bags filled with BooBerry Crunch`                                   <chr> ~
$ `Q6 | Skittles`                                                                          <chr> ~
$ `Q6 | Smarties (American)`                                                               <chr> ~
$ `Q6 | Smarties (Commonwealth)`                                                           <chr> ~
$ `Q6 | Snickers`                                                                          <chr> ~
$ `Q6 | Sourpatch Kids (i.e. abominations of nature)`                                      <chr> ~
$ `Q6 | Spotted Dick`                                                                      <chr> ~
$ `Q6 | Starburst`                                                                         <chr> ~
$ `Q6 | Sweet Tarts`                                                                       <chr> ~
$ `Q6 | Swedish Fish`                                                                      <chr> ~
$ `Q6 | Sweetums (a friend to diabetes)`                                                   <chr> ~
$ `Q6 | Take 5`                                                                            <chr> ~
$ `Q6 | Tic Tacs`                                                                          <chr> ~
$ `Q6 | Those odd marshmallow circus peanut things`                                        <chr> ~
$ `Q6 | Three Musketeers`                                                                  <chr> ~
$ `Q6 | Tolberone something or other`                                                      <chr> ~
$ `Q6 | Trail Mix`                                                                         <chr> ~
$ `Q6 | Twix`                                                                              <chr> ~
$ `Q6 | Vials of pure high fructose corn syrup, for main-lining into your vein`            <chr> ~
$ `Q6 | Vicodin`                                                                           <chr> ~
$ `Q6 | Whatchamacallit Bars`                                                              <chr> ~
$ `Q6 | White Bread`                                                                       <chr> ~
$ `Q6 | Whole Wheat anything`                                                              <chr> ~
$ `Q6 | York Peppermint Patties`                                                           <chr> ~
$ `Q7: JOY OTHER`                                                                          <chr> ~
$ `Q8: DESPAIR OTHER`                                                                      <chr> ~
$ `Q9: OTHER COMMENTS`                                                                     <chr> ~
$ `Q10: DRESS`                                                                             <chr> ~
$ ...114                                                                                   <chr> ~
$ `Q11: DAY`                                                                               <chr> ~
$ `Q12: MEDIA [Daily Dish]`                                                                <dbl> ~
$ `Q12: MEDIA [Science]`                                                                   <dbl> ~
$ `Q12: MEDIA [ESPN]`                                                                      <dbl> ~
$ `Q12: MEDIA [Yahoo]`                                                                     <dbl> ~
$ `Click Coordinates (x, y)`                                                               <chr> ~

Using Janitor to tidy up column names, bringing all to lower case and separating words with _

library(janitor)
janitor_candy_2015 <- janitor::clean_names(candy_2015)
janitor_candy_2015

janitor_candy_2016 <- janitor::clean_names(candy_2016)
janitor_candy_2016

janitor_candy_2017 <- janitor::clean_names(candy_2017)
janitor_candy_2017

Some columns took my interest due to confusion about what they might be about or whether people tended to have a certain opinion from first glance. For example, I was curious as to who was reporting back about these candies:

janitor_candy_2017 %>% 
  select(q3_age, q2_gender, q6_independent_m_ms, q6_green_party_m_ms)
# all types of people
janitor_candy_2016 %>% 
  select(york_peppermint_patties_ignore)
#nobody 

Cleaning

####REMOVE AND RENAME

Step 1 - Remove and add for each year (2015, 2016, 2017)

Step 2 - RENAME FOR EACH YEAR

2015 REMOVE AND ADD

# names(janitor_candy_2015)

col_removed_candy_2015 <- janitor_candy_2015 %>% 
  select(-c(116:124), -c(97:113), -c(93:95), -c(90, 91), 
         -c(peterson_brand_sidewalk_chalk, spotted_dick, mint_leaves, 
            joy_joy_mit_iodine, minibags_of_chips, lapel_pins, kale_smoothie, 
            hugs_actual_physical_hugs, heath_bar, healthy_fruit, 
            creepy_religious_comics_chick_tracts, broken_glow_stick, 
            glow_sticks, generic_brand_acetaminophen, dental_paraphenalia, 
            cash_or_other_forms_of_legal_tender,
            vials_of_pure_high_fructose_corn_syrup_for_main_lining_into_your_vein, 
            box_o_raisins, timestamp)) %>% 
  add_column(year = "2015", .before = 1) %>% 
  mutate(id_number = row_number(), .before = 2)


col_removed_candy_2015
#view(col_removed_candy_2015)

2015 RENAME

# Looking at differences between responses for Mary Janes ratings
# col_removed_candy_2015 %>% 
#  select(anonymous_brown_globs_that_come_in_black_and_orange_wrappers, mary_janes)

candy_2015_renamed <- col_removed_candy_2015 %>% 
  rename(age = how_old_are_you, 
         trick_or_treating = are_you_going_actually_going_trick_or_treating_yourself,
         anonymous_black_and_orange_wrapper = 
           anonymous_brown_globs_that_come_in_black_and_orange_wrappers, 
         brach_not_including_candy_corn = brach_products_not_including_candy_corn, 
         restaurant_candy = 
           candy_that_is_clearly_just_the_stuff_given_out_for_free_at_restaurants, 
         hersheys_dark_chocolate = dark_chocolate_hershey, 
         gummy_bears = gummy_bears_straight_up, 
         hersheys_kissables = hershey_s_kissables, 
         hersheys_milk_chocolate = hershey_s_milk_chocolate, 
         licorice_black = licorice, 
         reeses_peanut_butter_cups = reese_s_peanut_butter_cups, 
         toblerone = tolberone_something_or_other, 
         peanut_m_ms = peanut_m_m_s, 
         chick_o_stick = chick_o_sticks_we_don_t_know_what_that_is, 
         circus_peanuts = those_odd_marshmallow_circus_peanut_things, 
         sea_salt_chocolate = 
           sea_salt_flavored_stuff_probably_chocolate_since_this_is_the_it_flavor_of_the_year)

2016 - REMOVE AND ADD

col_removed_candy_2016 <- janitor_candy_2016 %>% 
  select(-c(104, 105, 107:123), 
         -c(vicodin, vials_of_pure_high_fructose_corn_syrup_for_main_lining_into_your_vein, 
            trail_mix, spotted_dick,
            person_of_interest_season_3_dvd_box_set_not_including_disc_4_with_hilarious_outtakes,
            minibags_of_chips, kale_smoothie, joy_joy_mit_iodine, hugs_actual_physical_hugs, 
            heath_bar, healthy_fruit, glow_sticks, generic_brand_acetaminophen, 
            dental_paraphenalia, creepy_religious_comics_chick_tracts, chardonnay,
            cash_or_other_forms_of_legal_tender, broken_glow_stick, boxo_raisins, 
            bonkers_the_board_game, timestamp)) %>% 
  add_column(year = "2016", .before = 1) %>% 
  mutate(id_number = max(candy_2015_renamed$id_number) + row_number(), .before = 2)
col_removed_candy_2016 

2016 RENAME

# Again checking on Mary Janes column differences 
# col_removed_candy_2016 %>% 
#   select(anonymous_brown_globs_that_come_in_black_and_orange_wrappers, mary_janes)

candy_2016_renamed <- col_removed_candy_2016 %>% 
  rename(trick_or_treating = 
           are_you_going_actually_going_trick_or_treating_yourself, 
         gender = your_gender, 
         age = how_old_are_you, 
         country = which_country_do_you_live_in, 
         state_or_prov = which_state_province_county_do_you_live_in, 
         anonymous_black_and_orange_wrapper = 
           anonymous_brown_globs_that_come_in_black_and_orange_wrappers, 
         bonkers = bonkers_the_candy, 
         restaurant_candy = 
           candy_that_is_clearly_just_the_stuff_given_out_for_free_at_restaurants, 
         chick_o_stick = chick_o_sticks_we_don_t_know_what_that_is, 
         gummy_bears = gummy_bears_straight_up, 
         hersheys_milk_chocolate = hershey_s_milk_chocolate, 
         licorice_black = licorice_yes_black, 
         peanut_m_ms = peanut_m_m_s, 
         party_bag_m_ms = third_party_m_ms, 
         reeses_peanut_butter_cups = reese_s_peanut_butter_cups, 
         sourpatch_kids = sourpatch_kids_i_e_abominations_of_nature, 
         sweetarts = sweet_tarts, 
         sweetums = sweetums_a_friend_to_diabetes, 
         circus_peanuts = those_odd_marshmallow_circus_peanut_things, 
         toblerone = tolberone_something_or_other)

candy_2016_renamed
NA

2017 CLEAN AND ADD Note - should have removed the “q6_” before this, but have done so in the next chunk

col_removed_candy_2017 <- janitor_candy_2017 %>%  
  select(-c(102, 104, 105, 107, 108, 110:120), 
         -c(q6_spotted_dick, 
            q6_sandwich_sized_bags_filled_with_boo_berry_crunch,
            q6_real_housewives_of_orange_county_season_9_blue_ray, 
            q6_minibags_of_chips, 
            q6_abstained_from_m_ming, 
            q6_kale_smoothie, q6_joy_joy_mit_iodine, 
            q6_hugs_actual_physical_hugs, 
            q6_heath_bar, 
            q6_healthy_fruit, 
            q6_glow_sticks, 
            q6_generic_brand_acetaminophen, 
            q6_dental_paraphenalia, 
            q6_creepy_religious_comics_chick_tracts, 
            q6_chardonnay, 
            q6_cash_or_other_forms_of_legal_tender, 
            q6_broken_glow_stick, 
            q6_boxo_raisins, 
            q6_bonkers_the_board_game, 
            internal_id)) %>% 
  add_column(year = "2017", .before = 1) %>% 
  mutate(id_number = max(candy_2016_renamed$id_number) + row_number(), .before = 2)

col_removed_candy_2017

2017 RENAME Remove “q1/2/3/4/5/6” from the start of column names and rename to match 2015 and 16


candy_2017_q_removed <- col_removed_candy_2017 %>% 
  rename_all(~ sub("^[q0-9]{2}_", "", 
                   make.names(names(col_removed_candy_2017))))


candy_2017_renamed <- candy_2017_q_removed %>% 
  rename(trick_or_treating = going_out, 
         state_or_prov = state_province_county_etc, 
         x100_grand_bar = `100_grand_bar`, 
         mary_janes = 
           anonymous_brown_globs_that_come_in_black_and_orange_wrappers_a_k_a_mary_janes, 
         bonkers = bonkers_the_candy, 
         restaurant_candy = 
           candy_that_is_clearly_just_the_stuff_given_out_for_free_at_restaurants, 
         chick_o_stick = chick_o_sticks_we_don_t_know_what_that_is, 
         gummy_bears = gummy_bears_straight_up, 
         hersheys_milk_chocolate = hershey_s_milk_chocolate, 
         licorice_black = licorice_yes_black, 
         peanut_m_ms = peanut_m_m_s, 
         green_m_ms = green_party_m_ms, 
         lone_m_ms = independent_m_ms, 
         reeses_peanut_butter_cups = reese_s_peanut_butter_cups, 
         sourpatch_kids = sourpatch_kids_i_e_abominations_of_nature, 
         sweetarts = sweet_tarts, 
         sweetums = sweetums_a_friend_to_diabetes, 
         circus_peanuts = those_odd_marshmallow_circus_peanut_things, 
         toblerone = tolberone_something_or_other)
  
candy_2017_renamed

Getting an idea of people’s responses:


distinct(candy_2015_renamed, age) 
  #(chr) 146 responses, some silly and some strange
distinct(candy_2015_renamed, trick_or_treating) 
  #(chr) yes or no (NAs in 2017)
distinct(candy_2015_renamed, starburst)


distinct(candy_2016_renamed, age) 
  # (chr) 98 incl silly/strange
distinct(candy_2016_renamed, trick_or_treating) 
  #(chr) Yes No (NAs in 2017)
distinct(candy_2016_renamed, gender) 
  # Male, Female, Other, I'd rather not say, NA
distinct(candy_2016_renamed, country) 
  #93 some silly, some e.g. USA, US, us, u.s.a. etc 
distinct(candy_2016_renamed, starburst)


distinct(candy_2017_renamed, age) 
  #(chr) 107 incl silly/strange
distinct(candy_2017_renamed, trick_or_treating)
  #(chr) Yes No and NA
distinct(candy_2017_renamed, gender) 
  #Male, Female, Other, I'd rather not say, NA
distinct(candy_2017_renamed, country) 
  #118 some silly, some e.g. USA, US, us, u.s.a. etc 
distinct(candy_2017_renamed, starburst)

####JOINING

Joining all three years by binding rows so as to keep everything

bound_candy <- bind_rows(candy_2015_renamed, 
                         candy_2016_renamed, 
                         candy_2017_renamed)

bound_candy <- bound_candy %>% 
  relocate(country, .before = 5) %>% 
  relocate(state_or_prov, .before = 6) %>% 
  relocate(gender, .before = 7)

# view(bound_candy)

##QUESTIONS (with additional cleaning in amongst my answers)

####QUESTION 1 What is the total number of candy ratings given across the three years. (Number of candy ratings, not the number of raters. Don’t count missing values)

ANSWER The total number of candy ratings across the three years was 590,010 ratings


total_ratings <- bound_candy %>% 
  select(-c(year, id_number, age, 
            trick_or_treating, country, 
            state_or_prov, gender)) %>%
  pivot_longer(butterfinger:take_5, 
               names_to = "candy", 
               values_to = "rating") %>% 
  filter(!is.na(rating)) %>% 
  count(n())
total_ratings
NA

####AGE CLEANING

Age is a character column with 274 distinct values. They are a mix of numbers, NAs, and strange and silly values. * I changed the “age” column to a numeric but it output strange figures, so I specified “as.integer” and the strange answers became NAs. * It seems unlikely that anyone over 100 years old is taking part, so I removed them.

# bound_candy %>% 
#  distinct(age)

bound_age_to_numeric <- bound_candy %>% 
  mutate(age = as.integer(age)) %>% 
  arrange(age)
Warning: Problem while computing `age = as.integer(age)`.
i NAs introduced by coercion
Warning: Problem while computing `age = as.integer(age)`.
i NAs introduced by coercion to integer range
# bound_age_to_numeric %>% 
# distinct(age)

bound_age_cleaning <- bound_age_to_numeric %>%
  mutate(age = if_else(age > 99, NA_integer_, age))
bound_age_cleaning
# view(bound_age_cleaning)

####QUESTION TWO What was the average age of people who are going out trick or treating?

ANSWER The (rounded) average age of those going trick or treating is 35 years old (34.94897 is the un-rounded value)

# bound_age_cleaning %>% 
#   distinct(trick_or_treating)

bound_age_cleaning %>% 
  select(age, trick_or_treating) %>% 
  group_by(trick_or_treating) %>% 
  summarise(average_age = round(mean(age, na.rm = TRUE)))

# to just get the answer for Yes on it's own: 
bound_age_cleaning %>% 
  select(age, trick_or_treating) %>% 
  group_by(trick_or_treating) %>% 
  filter(trick_or_treating == "Yes") %>% 
  summarise(average_age = round(mean(age, na.rm = TRUE)))
NA

####QUESTION THREE What was the average age of people who are not going trick or treating?

ANSWER The (rounded) average age of those not going trick or treating is 39 years old. (39.10454 is the unrounded value)

bound_age_cleaning %>% 
  select(age, trick_or_treating) %>% 
  group_by(trick_or_treating) %>% 
  summarise(average_age = round(mean(age, na.rm = TRUE)))

# to just get the answer for No on it's own: 
bound_age_cleaning %>% 
  select(age, trick_or_treating) %>% 
  group_by(trick_or_treating) %>% 
  filter(trick_or_treating == "No") %>% 
  summarise(average_age = round(mean(age, na.rm = TRUE)))
NA

####QUESTION FOUR For each of joy, despair and meh, which candy bar revived the most of these ratings?

ANSWER
* Despair: gum that comes with baseball cards returned the most despair responses with 7,341 * Joy: Full sized candy bars made the most people joyful with 7,589 responses. This seems very generic so I ran it again to remove the full sized candy bars and the top Joy response was: 7369 responses for reese’s peanut butter cups * Meh: 1,570 “Meh” responses were given for lollipops


rated_candy <- bound_candy %>% 
  select(-c(year, id_number, age, 
            trick_or_treating, country, 
            state_or_prov, gender, 
            any_full_sized_candy_bar)) %>%
  pivot_longer(butterfinger:take_5, 
               names_to = "candy", 
               values_to = "rating")
rated_candy

rated_candy %>% 
  group_by(rating, candy) %>% 
  summarise(number_of_ratings = n()) %>% 
  filter(number_of_ratings == max(number_of_ratings))
`summarise()` has grouped output by 'rating'. You can override using the `.groups` argument.

####QUESTION FIVE How many people rated Starburst as despair?

ANSWER 1990 people voted despair for starbursts.


rated_candy %>% 
  filter(candy == "starburst") %>% 
  group_by(rating) %>% 
  summarise(rating_count = n())
NA

———-QUESTIONS SIX, SEVEN, AND EIGHT AFTER COUNTRY CLEAN————-

####COUNTRY CLEANING

Firstly getting an idea of NAs and distinct country values:

bound_candy %>% 
  filter(is.na(country))

bound_candy %>% 
  distinct(country) 

Using stringr and regex to reduce “country” values

bound_country_clean <- bound_age_cleaning %>% 
  mutate(country = str_replace_all(country, pattern = "[0-9][0-9][.][0-9]", "States"),
         country = str_replace_all(country, pattern = "[3|4|5][0-9]", "States"),
         country = str_replace_all(country, pattern = "[uU][a-zA-Z.]* [sS][a-zA-Z]* [oO][fF] [Aa]*[a-zA-Z]*", "States"),
         country = str_replace_all(country, pattern = "[ .]*[uU]+[a-zA-Z.]* [sS]+[a-zA-Z]*[ .]*", "States"),
         country = str_replace_all(country, pattern = "[ ]*[uU]+[ .!]*[sS]+[ .!]*[aA]*[ .!]*", "States"),
         # the above changes austria and australia - watch out!
         country = str_replace_all(country, pattern = "[uU]+[nN]+[a-z]* [sS]+[tT][aA][tT][a-z]* [oO]+[fF] [aA][mM][a-z]*\t*", "States"),
         # there's still on "United States of America" which won't go - spaces?
         country = str_replace_all(country, pattern = "^[mM][uU|eE][rR]+[iI][cC|kK][aA]", "States"),
        country = str_replace_all(country, pattern = "^[aA][mM][eE][rR][iI][cC][aA]", "States"),
        country = str_replace_all(country, pattern = "^\\'[mM][uU|eE][rR][iI][cC][aA]", "States"),
        country = str_replace_all(country, pattern = "[Tthe]*[ ]*[sS]+[tT][aA][tT][a-z]*[Ss][tT][a-z]*[Ss]*[tT]*[a-z]*[Ss]*[tT]*[a-z]*", "States"),
          # removing States repeated
        country = str_replace_all(country, pattern = "[Tt][a-z]* [bB][a-z]* [a-zA-Z]+ [-]+ [uU][sS][aA]", "States"),
        # this was an attempt at "the best one - USA"
        country = str_replace_all(country, pattern = "[nN][a-z]+ [cC|yY|jJ]+[a-z]*|[pP|tT]+[iI|rR]+[tT|uU]+[a-z]+|[cC][aA][lL][iI][a-z]*|[aA][lL][aA][a-z]*", "States"),
        # The above is for "New York, North Carolina, New Jersey, Pittsburgh, Trumpistan, California, and Alaska (it also changed the end of New Zealand to New Zestates...)
        country = str_replace_all(country, pattern = "Ahem....Amerca", "States"),
        country = str_replace_all(country, pattern = "^[cC]+[aA]+[nN]+[aA]+[dD|eE]+[aA]*[aA|iI|rR]*[aA|nN]*[iI]*[aA]*[`]*|[s][o][v][a-z]* [cC][a-z]*", "Canada"),
        country = str_replace_all(country, pattern = "^[eE]+[nN]+[a-zA-Z]*|^[sS]+[cC]+[a-zA-Z]*|[uU]+[nN]+[a-zA-Z]* [kK]+[a-zA-Z]*", "United Kingdom"),
        country = str_replace_all(country, pattern = "^[eE]+[nN]+[a-zA-Z]*|^[sS]+[cC]+[a-zA-Z]*|[uU]+[nN]+[a-zA-Z]* [kK]+[.]*[a-zA-Z]*|[uU]+[.]*[kK]+[.]*", "United Kingdom")
                  )

bound_country_clean %>% 
  distinct(country)

# view(bound_country_clean)

Creating the “other” vectors and joining them to the data

rest_of_the_world <- c("Germany", "germany", "AStates", "aStates", "Statesa", 
                       "Japan", "Mexico", "Netherlands", "netherlands", "The Netherlands",
                       "Sweden", "Belgium", "Ireland", "New ZeStates", "Switzerland",
                       "China", "France", "france", "Denmark", "Korea", "South Korea",
                       "Brasil", "cascadia", "Cascadia", "Costa Rica", "croatia", 
                       "españa", "spain", "South africa", "Europe", "Finland", 
                       "finland", "Greece", "hong kong", "Hong Kong", "hungary",
                       "Iceland", "Indonesia", "kenya", "Not theStatesor Canada",
                       "Panama", "Philippines", "Portugal", "Singapore", "sweden",
                       "Taiwan", "UAE")

unknown_country <- c("Can", "Statesof A","Sub-Canadian North America...", "'Merica",
                     "TheStates", "1", "A", "A tropical island south of the equator", 
                     "Atlantis", "Denial", "Earth", "EUA", "Fear and Loathing", 
                     "I don't know anymore", "god's country", "insanity lately", 
                     "N. America", "I pretend to be from Canada, but I am really 
                     from theStates", "Narnia", "Neverland", "one of the best ones",
                     "See above", "Somewhere", "States(I think but it's an election 
                     year so who can really tell)", "States? Hard to tell anymore.",
                     "Statess", "subscribe to dm4uz3 on youtube", "the best one -States",
                     "The republic of Cascadia", "The States", "The Yoo Ess of Aaayyyyyy",
                     "there isn't one for old men", "this one", "UD", 
                     "United States of America")

candy_cleaned <- bound_country_clean %>% 
  mutate(country = if_else(country %in% rest_of_the_world, "Other", country),
         country = if_else(country %in% unknown_country, as.character(NA), country))

candy_cleaned %>% 
  distinct(country)
# still have 11 different "countries"

For the next three questions, count despair as -1, joy as +1, and meh as 0.

candy_pivot_ratings <- candy_cleaned %>% 
  select(-c(id_number, 
            age, 
            trick_or_treating, 
            state_or_prov)) %>% 
  pivot_longer(butterfinger:take_5, 
               names_to = "candy", 
               values_to = "rating") %>% 
  mutate(ratings_numeric = case_when(rating == "JOY" ~ 1, 
                                     rating == "DESPAIR" ~ -1,
                                     rating == "MEH" ~ 0)
         )
candy_pivot_ratings

####QUESTION SIX What was the most popular candy bar by this rating system for each gender in the dataset?

ANSWER The most popular candy bar for all four groups was “any full sized candy bar”. But, as decided in a previous question, this seems too generic so I would suggest the following top results: * “Female”: Reese’s Peanut Butter Cups. * “Male”: also Reese’s Peanut Butter Cups. * “Other”: Twix * “I’d rather not say”: Kit-Kat


candy_pivot_ratings %>% 
  filter(gender == "Female") %>% 
  group_by(candy) %>% 
  summarise(rating_count = mean(ratings_numeric, na.rm = TRUE)) %>% 
  arrange(desc(rating_count)) 


candy_pivot_ratings %>% 
  group_by(gender, candy) %>% 
  summarise(rating_count = mean(ratings_numeric, na.rm = TRUE)) %>% 
  arrange(desc(rating_count)) 
`summarise()` has grouped output by 'gender'. You can override using the `.groups` argument.

####QUESTION SEVEN What was the most popular candy bar in each year?

ANSWER * Again, the same “full sized candy bar” arguement re: it’s too generic means that the most popular candy bar in each year was: * 2015: Reese’s Peanut Butter Cups. * 2016: Kit-Kat. * 2017: Reese’s Peanut Butter Cups.


candy_pivot_ratings %>% 
  group_by(year, candy) %>% 
  summarise(rating_count = mean(ratings_numeric, na.rm = TRUE)) %>% 
  arrange(desc(rating_count))
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
NA

####QUESTION EIGHT What was the most popular candy bar by this rating for people in US, Canada, UK, and all other countries?

ANSWER “Any full sized candy bar” was ignored again due to being too generic, therefore each countries most popular candy was:

United States: Reese’s peanut butter cups Canada: Kit-Kat UK: Rolos The rest of the world: Kit-Kat


candy_pivot_ratings %>% 
  filter(country == "States") %>% 
  group_by(candy) %>%
  summarise(rating_count = mean(ratings_numeric, na.rm = TRUE)) %>% 
  arrange(desc(rating_count))

candy_pivot_ratings %>% 
  filter(country == "Canada") %>% 
  group_by(candy) %>%
  summarise(rating_count = mean(ratings_numeric, na.rm = TRUE)) %>% 
  arrange(desc(rating_count))

candy_pivot_ratings %>% 
  filter(country == "United Kingdom") %>% 
  group_by(candy) %>%
  summarise(rating_count = mean(ratings_numeric, na.rm = TRUE)) %>% 
  arrange(desc(rating_count))

candy_pivot_ratings %>% 
  filter(country == "Other") %>% 
  group_by(candy) %>%
  summarise(rating_count = mean(ratings_numeric, na.rm = TRUE)) %>% 
  arrange(desc(rating_count))
LS0tDQp0aXRsZTogIkRpcnR5IERhdGEgVGFzayA0IEFuYWx5c2lzX01haHJpIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCiMjIERpcnR5IERhdGEsIFRhc2sgRm91cg0KDQpUaHJlZSBleGNlbCBmaWxlcyBmcm9tIDIwMTUsIDIwMTYsIGFuZCAyMDE3IChuYW1lZCBjYW5keV8yMDE1LCBjYW5keV8yMDE2LCBhbmQgDQpjYW5keV8yMDE3IHJlc3BlY3RmdWxseSkgc2hvd2luZyBzdXJ2ZXkgYW5zd2VycyB0byBxdWVzdGlvbnMgcmVsYXRlZCB0byBlbmpveW1lbnQgDQpvZiBjZXJ0YWluIGNhbmRpZXMgd2VyZSByZWFkLCBqb2luZWQsIGFuZCBjbGVhbmVkIGJlZm9yZSBiZWluZyB3cml0dGVuIGludG8gYSANCmNzdiBmaWxlIHdoaWNoIGhhcyBiZWVuIHJlYWQgYmVsb3cuDQpBbGwgdGhyZWUgcXVlc3Rpb25uYWlyZXMgYXNrZWQgZm9yIHJlc3BvbmRlbnQncyBhZ2VzIGhvd2V2ZXIgb25seSAyMDE2IGFuZCAyMDE3IA0KcXVlc3Rpb25uYWlyZXMgYXNrZWQgZm9yIHRoZWlyIGdlbmRlciBhbmQgZm9yIHRoZSBjb3VudHJ5IGFuZCBzdGF0ZS9wcm92aW5jZSB0aGUNCnJlc3BvbmRlbnQgd2FzIGZyb20uIA0KUmVzcG9uZGVudCdzIG11c3QgaGF2ZSBiZWVuIGdpdmVuIHRoZSBxdWVzdGlvbm5haXJlcyB0byBmaWxsIGluIHRoZW1zZWx2ZXMgYXMgDQpzcGVsbGluZ3MgYXJlIGluY3JlZGlibHkgdmFyaWVkIChlLmcuICJVUyIsICJ1LnMuYS4iLCAidW5pdGVkIHN0YXRlcyIpIGFuZCB0aGVyZSANCmFyZSBzb21lIHJhdGhlciBpbnRlcmVzdGluZyByZXNwb25zZXMsIGVzcGVjaWFsbHkgdW5kZXIgYWdlIChlLmcuICJvbGQgZW5vdWdoIikgDQphbmQgY291bnRyeSAoZS5nLiAiJ211cnJpa2EhIikuIA0KRnJvbSBmaXJzdCBnbGFuY2UsIHRoZSBjYW5keSBuYW1lcyB0aGF0IGhhdmUgYmVlbiBhc2tlZCBhYm91dCBhcmUgdmFzdCBhbmQgcmFuZ2UgDQpmcm9tIHRoZSBmdWxsIG5hbWUgdG8gYSBndWVzcyAoZS5nLiAiVG9sYmVyb25lIHNvbWV0aGluZyBvciBvdGhlciIpLCB0aGlzIG1heSANCmxlYWQgdG8gdGhlcmUgbm90IGJlaW5nIGdyZWF0IGRpc2NyZXBhbmNpZXMgaW4gdGhlIHJlc3VsdHMuIEZ1cnRoZXIgImZ1bGwgc2l6ZWQgDQpjYW5keSBiYXJzIiBzZWVtcyByYXRoZXIgZ2VuZXJpYyBzbyBpdCBoYXMgYmVlbiBpZ25vcmVkIHdoZW4gY29uc2lkZXJpbmcgc29tZSANCm9mIHRoZSBxdWVzdGlvbnMuDQoNCg0KTG9hZGluZyBhcHByb3ByaWF0ZSBsaWJyYXJpZXMNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoaGVyZSkNCmBgYA0KDQpSZWFkaW5nIHRoZSBjbGVhbiBkYXRhIGNzdiBmaWxlLg0KYGBge3J9DQpjYW5keV9jbGVhbmVkIDwtIHJlYWRfY3N2KCIuLi9jbGVhbl9kYXRhL2NhbmR5X2NsZWFuZWQuY3N2IikNCmBgYA0KDQpVc2luZyBnbGltcHNlLCBoZWFkLCBhbmQgdmlld2luZyB0aGUgZnVsbCBmaWxlcywgSSBnb3QgYW4gb3ZlcnZpZXcgb2YgdGhlIGRhdGEsDQp2YXJpYWJsZXMsIHR5cGVzLCBhbmQgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgZmlsZXMuDQpgYGB7cn0NCmhlYWQoY2FuZHlfMjAxNSkNCmdsaW1wc2UoY2FuZHlfMjAxNikNCmdsaW1wc2UoY2FuZHlfMjAxNykNCmBgYA0KDQoNClVzaW5nIEphbml0b3IgdG8gdGlkeSB1cCBjb2x1bW4gbmFtZXMsIGJyaW5naW5nIGFsbCB0byBsb3dlciBjYXNlIGFuZCBzZXBhcmF0aW5nIA0Kd29yZHMgd2l0aCBfDQpgYGB7cn0NCmxpYnJhcnkoamFuaXRvcikNCmBgYA0KDQpgYGB7cn0NCmphbml0b3JfY2FuZHlfMjAxNSA8LSBqYW5pdG9yOjpjbGVhbl9uYW1lcyhjYW5keV8yMDE1KQ0KamFuaXRvcl9jYW5keV8yMDE1DQoNCmphbml0b3JfY2FuZHlfMjAxNiA8LSBqYW5pdG9yOjpjbGVhbl9uYW1lcyhjYW5keV8yMDE2KQ0KamFuaXRvcl9jYW5keV8yMDE2DQoNCmphbml0b3JfY2FuZHlfMjAxNyA8LSBqYW5pdG9yOjpjbGVhbl9uYW1lcyhjYW5keV8yMDE3KQ0KamFuaXRvcl9jYW5keV8yMDE3DQpgYGANCg0KDQpTb21lIGNvbHVtbnMgdG9vayBteSBpbnRlcmVzdCBkdWUgdG8gY29uZnVzaW9uIGFib3V0IHdoYXQgdGhleSBtaWdodCBiZSBhYm91dA0Kb3Igd2hldGhlciBwZW9wbGUgdGVuZGVkIHRvIGhhdmUgYSBjZXJ0YWluIG9waW5pb24gZnJvbSBmaXJzdCBnbGFuY2UuIA0KRm9yIGV4YW1wbGUsIEkgd2FzIGN1cmlvdXMgYXMgdG8gd2hvIHdhcyByZXBvcnRpbmcgYmFjayBhYm91dCB0aGVzZSBjYW5kaWVzOiANCmBgYHtyfQ0KamFuaXRvcl9jYW5keV8yMDE3ICU+JSANCiAgc2VsZWN0KHEzX2FnZSwgcTJfZ2VuZGVyLCBxNl9pbmRlcGVuZGVudF9tX21zLCBxNl9ncmVlbl9wYXJ0eV9tX21zKQ0KIyBhbGwgdHlwZXMgb2YgcGVvcGxlDQpqYW5pdG9yX2NhbmR5XzIwMTYgJT4lIA0KICBzZWxlY3QoeW9ya19wZXBwZXJtaW50X3BhdHRpZXNfaWdub3JlKQ0KI25vYm9keSANCmBgYA0KDQojIyAqKkNsZWFuaW5nKiogDQoNCiMjIyMqKlJFTU9WRSBBTkQgUkVOQU1FKiogDQoNClN0ZXAgMSAtIFJlbW92ZSBhbmQgYWRkIGZvciBlYWNoIHllYXIgKDIwMTUsIDIwMTYsIDIwMTcpDQoNCiogRm9yIGVhY2ggb2YgdGhlIHRocmVlIHllYXJzLCBJIHJlbW92ZWQgY29sdW1ucyB0aGF0IHdlcmVuJ3QgY2FuZHkgaGF2aW5nIA0KIHNlYXJjaGVkIHRoZSBpbnRlcm5ldCB0byBjaGVjayBvbiB0aG9zZSBJIHdhcyBub3Qgc3VyZSBvZi4gSSBhbHNvIGxvb2tlZCBpbnRvDQogcmVzcG9uc2VzIGZvciBhIGZldyBvZiB0aGUgY29sdW1ucyAoZS5nLiBkaWZmZXJlbnQgbSZtcyBjb2xvcnMpIHRvIHNlZSBpZiB0aGVyZQ0KIHdlcmUgbW9zdGx5IGpva2UgcmVzcG9uc2VzLyBhbnkgcmVhc29uIGZvciBtZSB0byBqb2luIHRoZW0gdG9nZXRoZXIgKEkga2VwdA0KIHRoZW0gYXMgaXMgZXhjcGV0IGZvciBjaGFuZ2luZyBzb21lIG5hbWVzIHRvIG1ha2UgaXQgY2xlYXJlciB0byBtZSB3aGF0IHRoZXkgDQogd2VyZSAtIGUuZy4gcGFydHkgYmFnIG9mIG0mbXMpDQoqIEkgcmVtb3ZlZCBjb2x1bW5zIGJ5IGluZGV4IGZyb20gbGFzdCBwb3NpdGlvbiB0byBmaXJzdCBzbyB0aGF0IEkgY291bGQgY2hlY2sgDQogdGhhdCBJIGRpZG4ndCByZW1vdmUgdGhlIHdyb25nIGNvbHVtbnMvIGFmZmVjdCB0aGUgb3JkZXIgYXMgSSB3ZW50Lg0KKiBBbHNvIGFkZGluZyBhICJ5ZWFyIiBjb2x1bW4gYW5kIHJlbW92aW5nICJ0aW1lc3RhbXAiIGZyb20gMjAxNSBhbmQgMjAxNiANCiBmb3IgcmVmZXJlbmNpbmcgdGhlIGNvcnJlY3QgeWVhcnMgYWZ0ZXIgYmluZGluZyB0aGUgcm93cyBvZiBhbGwgdGhyZWUgdG9nZXRoZXIuDQogSSBhZGRlZCB0aGlzIGFmdGVyIHJlbW92aW5nIHRoZSBvdGhlcnMgc28gdGhhdCB0aGUgY29sdW1uIGluZGV4IHdhc24ndCBhZmZlY3RlZC4NCiogQWRkZWQgYSBwZXJzb25hbCBJRCBudW1iZXIganVzdCB0byB0cnkgZGlmZmVyZW50IHdheXMgb2YgYWRkaW5nLyBtdXRhdGluZw0KIGNvbHVtbnMuIChub3RlIC0gd2VudCB0byBiYXNlIFIgdG8gZG8gdGhpcyBmb3IgMjAxNiAmIDE3KQ0KKiBJIHByb2JhYmx5IGRpZG4ndCBoYXZlIHRvIHJlbW92ZSBhbGwgb2YgdGhpcyAoZGVwZW5kaW5nIG9uIHF1ZXN0aW9uIGFuZCBvdXRjb21lKSANCiAgYnV0IEkgbGlrZSB0aGF0IGl0IGdpdmVzIG1lIGxlc3MgdG8gd29yayB3aXRoLg0KDQpTdGVwIDIgLSBSRU5BTUUgRk9SIEVBQ0ggWUVBUg0KDQoqIFJlbmFtaW5nIGNvbHVtbnMgc28gdGhleSBtYXRjaCBvdGhlciB5ZWFycyB3aGVuIGJpbmRpbmcgcm93cy4gDQoqIENvbnNpZGVyZWQgbWVyZ2luZyB0aGUgMjAxNSBhbmQgMjAxNiAiYW5vbnltb3VzIGJyb3duIGdsb2JzIGV0Yy4iIGNvbHVtbnMgd2l0aCANCiB0aGVpciAiTWFyeSBKYW5lcyIgY29sdW1ucyBiZWNhdXNlIGluIDIwMTcgdGhlcmUgaXMgYSByZWNvcmQgb2YgImFub24gYnJvd24uLi4gDQogYWthIE1hcnkgSmFuZXMiKS4gQnV0IGZyb20gbG9va2luZyBhdCBpbmRpdmlkdWFsIHJlc3BvbnNlcywgdGhleSBkb24ndCBtYXRjaCANCiB1cCBzbyBJJ2xsIGxlYXZlIGFzICJhbm9ueW1vdXNfYmxhY2tfYW5kX29yYW5nZV93cmFwcGVyIiBhbmQgIm1hcnlfamFuZXMiLg0KDQoNCioqMjAxNSBSRU1PVkUgQU5EIEFERCoqDQoNCmBgYHtyfQ0KIyBuYW1lcyhqYW5pdG9yX2NhbmR5XzIwMTUpDQoNCmNvbF9yZW1vdmVkX2NhbmR5XzIwMTUgPC0gamFuaXRvcl9jYW5keV8yMDE1ICU+JSANCiAgc2VsZWN0KC1jKDExNjoxMjQpLCAtYyg5NzoxMTMpLCAtYyg5Mzo5NSksIC1jKDkwLCA5MSksIA0KICAgICAgICAgLWMocGV0ZXJzb25fYnJhbmRfc2lkZXdhbGtfY2hhbGssIHNwb3R0ZWRfZGljaywgbWludF9sZWF2ZXMsIA0KICAgICAgICAgICAgam95X2pveV9taXRfaW9kaW5lLCBtaW5pYmFnc19vZl9jaGlwcywgbGFwZWxfcGlucywga2FsZV9zbW9vdGhpZSwgDQogICAgICAgICAgICBodWdzX2FjdHVhbF9waHlzaWNhbF9odWdzLCBoZWF0aF9iYXIsIGhlYWx0aHlfZnJ1aXQsIA0KICAgICAgICAgICAgY3JlZXB5X3JlbGlnaW91c19jb21pY3NfY2hpY2tfdHJhY3RzLCBicm9rZW5fZ2xvd19zdGljaywgDQogICAgICAgICAgICBnbG93X3N0aWNrcywgZ2VuZXJpY19icmFuZF9hY2V0YW1pbm9waGVuLCBkZW50YWxfcGFyYXBoZW5hbGlhLCANCiAgICAgICAgICAgIGNhc2hfb3Jfb3RoZXJfZm9ybXNfb2ZfbGVnYWxfdGVuZGVyLA0KICAgICAgICAgICAgdmlhbHNfb2ZfcHVyZV9oaWdoX2ZydWN0b3NlX2Nvcm5fc3lydXBfZm9yX21haW5fbGluaW5nX2ludG9feW91cl92ZWluLCANCiAgICAgICAgICAgIGJveF9vX3JhaXNpbnMsIHRpbWVzdGFtcCkpICU+JSANCiAgYWRkX2NvbHVtbih5ZWFyID0gIjIwMTUiLCAuYmVmb3JlID0gMSkgJT4lIA0KICBtdXRhdGUoaWRfbnVtYmVyID0gcm93X251bWJlcigpLCAuYmVmb3JlID0gMikNCg0KDQpjb2xfcmVtb3ZlZF9jYW5keV8yMDE1DQojdmlldyhjb2xfcmVtb3ZlZF9jYW5keV8yMDE1KQ0KDQpgYGANCg0KDQoqKjIwMTUgUkVOQU1FKioNCmBgYHtyfQ0KIyBMb29raW5nIGF0IGRpZmZlcmVuY2VzIGJldHdlZW4gcmVzcG9uc2VzIGZvciBNYXJ5IEphbmVzIHJhdGluZ3MNCiMgY29sX3JlbW92ZWRfY2FuZHlfMjAxNSAlPiUgDQojICBzZWxlY3QoYW5vbnltb3VzX2Jyb3duX2dsb2JzX3RoYXRfY29tZV9pbl9ibGFja19hbmRfb3JhbmdlX3dyYXBwZXJzLCBtYXJ5X2phbmVzKQ0KDQpjYW5keV8yMDE1X3JlbmFtZWQgPC0gY29sX3JlbW92ZWRfY2FuZHlfMjAxNSAlPiUgDQogIHJlbmFtZShhZ2UgPSBob3dfb2xkX2FyZV95b3UsIA0KICAgICAgICAgdHJpY2tfb3JfdHJlYXRpbmcgPSBhcmVfeW91X2dvaW5nX2FjdHVhbGx5X2dvaW5nX3RyaWNrX29yX3RyZWF0aW5nX3lvdXJzZWxmLA0KICAgICAgICAgYW5vbnltb3VzX2JsYWNrX2FuZF9vcmFuZ2Vfd3JhcHBlciA9IA0KICAgICAgICAgICBhbm9ueW1vdXNfYnJvd25fZ2xvYnNfdGhhdF9jb21lX2luX2JsYWNrX2FuZF9vcmFuZ2Vfd3JhcHBlcnMsIA0KICAgICAgICAgYnJhY2hfbm90X2luY2x1ZGluZ19jYW5keV9jb3JuID0gYnJhY2hfcHJvZHVjdHNfbm90X2luY2x1ZGluZ19jYW5keV9jb3JuLCANCiAgICAgICAgIHJlc3RhdXJhbnRfY2FuZHkgPSANCiAgICAgICAgICAgY2FuZHlfdGhhdF9pc19jbGVhcmx5X2p1c3RfdGhlX3N0dWZmX2dpdmVuX291dF9mb3JfZnJlZV9hdF9yZXN0YXVyYW50cywgDQogICAgICAgICBoZXJzaGV5c19kYXJrX2Nob2NvbGF0ZSA9IGRhcmtfY2hvY29sYXRlX2hlcnNoZXksIA0KICAgICAgICAgZ3VtbXlfYmVhcnMgPSBndW1teV9iZWFyc19zdHJhaWdodF91cCwgDQogICAgICAgICBoZXJzaGV5c19raXNzYWJsZXMgPSBoZXJzaGV5X3Nfa2lzc2FibGVzLCANCiAgICAgICAgIGhlcnNoZXlzX21pbGtfY2hvY29sYXRlID0gaGVyc2hleV9zX21pbGtfY2hvY29sYXRlLCANCiAgICAgICAgIGxpY29yaWNlX2JsYWNrID0gbGljb3JpY2UsIA0KICAgICAgICAgcmVlc2VzX3BlYW51dF9idXR0ZXJfY3VwcyA9IHJlZXNlX3NfcGVhbnV0X2J1dHRlcl9jdXBzLCANCiAgICAgICAgIHRvYmxlcm9uZSA9IHRvbGJlcm9uZV9zb21ldGhpbmdfb3Jfb3RoZXIsIA0KICAgICAgICAgcGVhbnV0X21fbXMgPSBwZWFudXRfbV9tX3MsIA0KICAgICAgICAgY2hpY2tfb19zdGljayA9IGNoaWNrX29fc3RpY2tzX3dlX2Rvbl90X2tub3dfd2hhdF90aGF0X2lzLCANCiAgICAgICAgIGNpcmN1c19wZWFudXRzID0gdGhvc2Vfb2RkX21hcnNobWFsbG93X2NpcmN1c19wZWFudXRfdGhpbmdzLCANCiAgICAgICAgIHNlYV9zYWx0X2Nob2NvbGF0ZSA9IA0KICAgICAgICAgICBzZWFfc2FsdF9mbGF2b3JlZF9zdHVmZl9wcm9iYWJseV9jaG9jb2xhdGVfc2luY2VfdGhpc19pc190aGVfaXRfZmxhdm9yX29mX3RoZV95ZWFyKQ0KDQpgYGANCg0KDQoqKjIwMTYgLSBSRU1PVkUgQU5EIEFERCoqIA0KDQpgYGB7cn0NCmNvbF9yZW1vdmVkX2NhbmR5XzIwMTYgPC0gamFuaXRvcl9jYW5keV8yMDE2ICU+JSANCiAgc2VsZWN0KC1jKDEwNCwgMTA1LCAxMDc6MTIzKSwgDQogICAgICAgICAtYyh2aWNvZGluLCB2aWFsc19vZl9wdXJlX2hpZ2hfZnJ1Y3Rvc2VfY29ybl9zeXJ1cF9mb3JfbWFpbl9saW5pbmdfaW50b195b3VyX3ZlaW4sIA0KICAgICAgICAgICAgdHJhaWxfbWl4LCBzcG90dGVkX2RpY2ssDQogICAgICAgICAgICBwZXJzb25fb2ZfaW50ZXJlc3Rfc2Vhc29uXzNfZHZkX2JveF9zZXRfbm90X2luY2x1ZGluZ19kaXNjXzRfd2l0aF9oaWxhcmlvdXNfb3V0dGFrZXMsDQogICAgICAgICAgICBtaW5pYmFnc19vZl9jaGlwcywga2FsZV9zbW9vdGhpZSwgam95X2pveV9taXRfaW9kaW5lLCBodWdzX2FjdHVhbF9waHlzaWNhbF9odWdzLCANCiAgICAgICAgICAgIGhlYXRoX2JhciwgaGVhbHRoeV9mcnVpdCwgZ2xvd19zdGlja3MsIGdlbmVyaWNfYnJhbmRfYWNldGFtaW5vcGhlbiwgDQogICAgICAgICAgICBkZW50YWxfcGFyYXBoZW5hbGlhLCBjcmVlcHlfcmVsaWdpb3VzX2NvbWljc19jaGlja190cmFjdHMsIGNoYXJkb25uYXksDQogICAgICAgICAgICBjYXNoX29yX290aGVyX2Zvcm1zX29mX2xlZ2FsX3RlbmRlciwgYnJva2VuX2dsb3dfc3RpY2ssIGJveG9fcmFpc2lucywgDQogICAgICAgICAgICBib25rZXJzX3RoZV9ib2FyZF9nYW1lLCB0aW1lc3RhbXApKSAlPiUgDQogIGFkZF9jb2x1bW4oeWVhciA9ICIyMDE2IiwgLmJlZm9yZSA9IDEpICU+JSANCiAgbXV0YXRlKGlkX251bWJlciA9IG1heChjYW5keV8yMDE1X3JlbmFtZWQkaWRfbnVtYmVyKSArIHJvd19udW1iZXIoKSwgLmJlZm9yZSA9IDIpDQpjb2xfcmVtb3ZlZF9jYW5keV8yMDE2IA0KYGBgDQoNCioqMjAxNiBSRU5BTUUqKg0KDQpgYGB7cn0NCiMgQWdhaW4gY2hlY2tpbmcgb24gTWFyeSBKYW5lcyBjb2x1bW4gZGlmZmVyZW5jZXMgDQojIGNvbF9yZW1vdmVkX2NhbmR5XzIwMTYgJT4lIA0KIyAgIHNlbGVjdChhbm9ueW1vdXNfYnJvd25fZ2xvYnNfdGhhdF9jb21lX2luX2JsYWNrX2FuZF9vcmFuZ2Vfd3JhcHBlcnMsIG1hcnlfamFuZXMpDQoNCmNhbmR5XzIwMTZfcmVuYW1lZCA8LSBjb2xfcmVtb3ZlZF9jYW5keV8yMDE2ICU+JSANCiAgcmVuYW1lKHRyaWNrX29yX3RyZWF0aW5nID0gDQogICAgICAgICAgIGFyZV95b3VfZ29pbmdfYWN0dWFsbHlfZ29pbmdfdHJpY2tfb3JfdHJlYXRpbmdfeW91cnNlbGYsIA0KICAgICAgICAgZ2VuZGVyID0geW91cl9nZW5kZXIsIA0KICAgICAgICAgYWdlID0gaG93X29sZF9hcmVfeW91LCANCiAgICAgICAgIGNvdW50cnkgPSB3aGljaF9jb3VudHJ5X2RvX3lvdV9saXZlX2luLCANCiAgICAgICAgIHN0YXRlX29yX3Byb3YgPSB3aGljaF9zdGF0ZV9wcm92aW5jZV9jb3VudHlfZG9feW91X2xpdmVfaW4sIA0KICAgICAgICAgYW5vbnltb3VzX2JsYWNrX2FuZF9vcmFuZ2Vfd3JhcHBlciA9IA0KICAgICAgICAgICBhbm9ueW1vdXNfYnJvd25fZ2xvYnNfdGhhdF9jb21lX2luX2JsYWNrX2FuZF9vcmFuZ2Vfd3JhcHBlcnMsIA0KICAgICAgICAgYm9ua2VycyA9IGJvbmtlcnNfdGhlX2NhbmR5LCANCiAgICAgICAgIHJlc3RhdXJhbnRfY2FuZHkgPSANCiAgICAgICAgICAgY2FuZHlfdGhhdF9pc19jbGVhcmx5X2p1c3RfdGhlX3N0dWZmX2dpdmVuX291dF9mb3JfZnJlZV9hdF9yZXN0YXVyYW50cywgDQogICAgICAgICBjaGlja19vX3N0aWNrID0gY2hpY2tfb19zdGlja3Nfd2VfZG9uX3Rfa25vd193aGF0X3RoYXRfaXMsIA0KICAgICAgICAgZ3VtbXlfYmVhcnMgPSBndW1teV9iZWFyc19zdHJhaWdodF91cCwgDQogICAgICAgICBoZXJzaGV5c19taWxrX2Nob2NvbGF0ZSA9IGhlcnNoZXlfc19taWxrX2Nob2NvbGF0ZSwgDQogICAgICAgICBsaWNvcmljZV9ibGFjayA9IGxpY29yaWNlX3llc19ibGFjaywgDQogICAgICAgICBwZWFudXRfbV9tcyA9IHBlYW51dF9tX21fcywgDQogICAgICAgICBwYXJ0eV9iYWdfbV9tcyA9IHRoaXJkX3BhcnR5X21fbXMsIA0KICAgICAgICAgcmVlc2VzX3BlYW51dF9idXR0ZXJfY3VwcyA9IHJlZXNlX3NfcGVhbnV0X2J1dHRlcl9jdXBzLCANCiAgICAgICAgIHNvdXJwYXRjaF9raWRzID0gc291cnBhdGNoX2tpZHNfaV9lX2Fib21pbmF0aW9uc19vZl9uYXR1cmUsIA0KICAgICAgICAgc3dlZXRhcnRzID0gc3dlZXRfdGFydHMsIA0KICAgICAgICAgc3dlZXR1bXMgPSBzd2VldHVtc19hX2ZyaWVuZF90b19kaWFiZXRlcywgDQogICAgICAgICBjaXJjdXNfcGVhbnV0cyA9IHRob3NlX29kZF9tYXJzaG1hbGxvd19jaXJjdXNfcGVhbnV0X3RoaW5ncywgDQogICAgICAgICB0b2JsZXJvbmUgPSB0b2xiZXJvbmVfc29tZXRoaW5nX29yX290aGVyKQ0KDQpjYW5keV8yMDE2X3JlbmFtZWQNCg0KYGBgDQoNCg0KKioyMDE3IENMRUFOIEFORCBBREQqKg0KTm90ZSAtIHNob3VsZCBoYXZlIHJlbW92ZWQgdGhlICJxNl8iIGJlZm9yZSB0aGlzLCBidXQgaGF2ZSBkb25lIHNvIGluIHRoZSBuZXh0IA0KY2h1bmsgDQoNCmBgYHtyfQ0KY29sX3JlbW92ZWRfY2FuZHlfMjAxNyA8LSBqYW5pdG9yX2NhbmR5XzIwMTcgJT4lICANCiAgc2VsZWN0KC1jKDEwMiwgMTA0LCAxMDUsIDEwNywgMTA4LCAxMTA6MTIwKSwgDQogICAgICAgICAtYyhxNl9zcG90dGVkX2RpY2ssIA0KICAgICAgICAgICAgcTZfc2FuZHdpY2hfc2l6ZWRfYmFnc19maWxsZWRfd2l0aF9ib29fYmVycnlfY3J1bmNoLA0KICAgICAgICAgICAgcTZfcmVhbF9ob3VzZXdpdmVzX29mX29yYW5nZV9jb3VudHlfc2Vhc29uXzlfYmx1ZV9yYXksIA0KICAgICAgICAgICAgcTZfbWluaWJhZ3Nfb2ZfY2hpcHMsIA0KICAgICAgICAgICAgcTZfYWJzdGFpbmVkX2Zyb21fbV9taW5nLCANCiAgICAgICAgICAgIHE2X2thbGVfc21vb3RoaWUsIHE2X2pveV9qb3lfbWl0X2lvZGluZSwgDQogICAgICAgICAgICBxNl9odWdzX2FjdHVhbF9waHlzaWNhbF9odWdzLCANCiAgICAgICAgICAgIHE2X2hlYXRoX2JhciwgDQogICAgICAgICAgICBxNl9oZWFsdGh5X2ZydWl0LCANCiAgICAgICAgICAgIHE2X2dsb3dfc3RpY2tzLCANCiAgICAgICAgICAgIHE2X2dlbmVyaWNfYnJhbmRfYWNldGFtaW5vcGhlbiwgDQogICAgICAgICAgICBxNl9kZW50YWxfcGFyYXBoZW5hbGlhLCANCiAgICAgICAgICAgIHE2X2NyZWVweV9yZWxpZ2lvdXNfY29taWNzX2NoaWNrX3RyYWN0cywgDQogICAgICAgICAgICBxNl9jaGFyZG9ubmF5LCANCiAgICAgICAgICAgIHE2X2Nhc2hfb3Jfb3RoZXJfZm9ybXNfb2ZfbGVnYWxfdGVuZGVyLCANCiAgICAgICAgICAgIHE2X2Jyb2tlbl9nbG93X3N0aWNrLCANCiAgICAgICAgICAgIHE2X2JveG9fcmFpc2lucywgDQogICAgICAgICAgICBxNl9ib25rZXJzX3RoZV9ib2FyZF9nYW1lLCANCiAgICAgICAgICAgIGludGVybmFsX2lkKSkgJT4lIA0KICBhZGRfY29sdW1uKHllYXIgPSAiMjAxNyIsIC5iZWZvcmUgPSAxKSAlPiUgDQogIG11dGF0ZShpZF9udW1iZXIgPSBtYXgoY2FuZHlfMjAxNl9yZW5hbWVkJGlkX251bWJlcikgKyByb3dfbnVtYmVyKCksIC5iZWZvcmUgPSAyKQ0KDQpjb2xfcmVtb3ZlZF9jYW5keV8yMDE3DQpgYGANCg0KKioyMDE3IFJFTkFNRSoqDQpSZW1vdmUgInExLzIvMy80LzUvNiIgZnJvbSB0aGUgc3RhcnQgb2YgY29sdW1uIG5hbWVzDQphbmQgcmVuYW1lIHRvIG1hdGNoIDIwMTUgYW5kIDE2DQoNCmBgYHtyfQ0KDQpjYW5keV8yMDE3X3FfcmVtb3ZlZCA8LSBjb2xfcmVtb3ZlZF9jYW5keV8yMDE3ICU+JSANCiAgcmVuYW1lX2FsbCh+IHN1YigiXltxMC05XXsyfV8iLCAiIiwgDQogICAgICAgICAgICAgICAgICAgbWFrZS5uYW1lcyhuYW1lcyhjb2xfcmVtb3ZlZF9jYW5keV8yMDE3KSkpKQ0KDQoNCmNhbmR5XzIwMTdfcmVuYW1lZCA8LSBjYW5keV8yMDE3X3FfcmVtb3ZlZCAlPiUgDQogIHJlbmFtZSh0cmlja19vcl90cmVhdGluZyA9IGdvaW5nX291dCwgDQogICAgICAgICBzdGF0ZV9vcl9wcm92ID0gc3RhdGVfcHJvdmluY2VfY291bnR5X2V0YywgDQogICAgICAgICB4MTAwX2dyYW5kX2JhciA9IGAxMDBfZ3JhbmRfYmFyYCwgDQogICAgICAgICBtYXJ5X2phbmVzID0gDQogICAgICAgICAgIGFub255bW91c19icm93bl9nbG9ic190aGF0X2NvbWVfaW5fYmxhY2tfYW5kX29yYW5nZV93cmFwcGVyc19hX2tfYV9tYXJ5X2phbmVzLCANCiAgICAgICAgIGJvbmtlcnMgPSBib25rZXJzX3RoZV9jYW5keSwgDQogICAgICAgICByZXN0YXVyYW50X2NhbmR5ID0gDQogICAgICAgICAgIGNhbmR5X3RoYXRfaXNfY2xlYXJseV9qdXN0X3RoZV9zdHVmZl9naXZlbl9vdXRfZm9yX2ZyZWVfYXRfcmVzdGF1cmFudHMsIA0KICAgICAgICAgY2hpY2tfb19zdGljayA9IGNoaWNrX29fc3RpY2tzX3dlX2Rvbl90X2tub3dfd2hhdF90aGF0X2lzLCANCiAgICAgICAgIGd1bW15X2JlYXJzID0gZ3VtbXlfYmVhcnNfc3RyYWlnaHRfdXAsIA0KICAgICAgICAgaGVyc2hleXNfbWlsa19jaG9jb2xhdGUgPSBoZXJzaGV5X3NfbWlsa19jaG9jb2xhdGUsIA0KICAgICAgICAgbGljb3JpY2VfYmxhY2sgPSBsaWNvcmljZV95ZXNfYmxhY2ssIA0KICAgICAgICAgcGVhbnV0X21fbXMgPSBwZWFudXRfbV9tX3MsIA0KICAgICAgICAgZ3JlZW5fbV9tcyA9IGdyZWVuX3BhcnR5X21fbXMsIA0KICAgICAgICAgbG9uZV9tX21zID0gaW5kZXBlbmRlbnRfbV9tcywgDQogICAgICAgICByZWVzZXNfcGVhbnV0X2J1dHRlcl9jdXBzID0gcmVlc2Vfc19wZWFudXRfYnV0dGVyX2N1cHMsIA0KICAgICAgICAgc291cnBhdGNoX2tpZHMgPSBzb3VycGF0Y2hfa2lkc19pX2VfYWJvbWluYXRpb25zX29mX25hdHVyZSwgDQogICAgICAgICBzd2VldGFydHMgPSBzd2VldF90YXJ0cywgDQogICAgICAgICBzd2VldHVtcyA9IHN3ZWV0dW1zX2FfZnJpZW5kX3RvX2RpYWJldGVzLCANCiAgICAgICAgIGNpcmN1c19wZWFudXRzID0gdGhvc2Vfb2RkX21hcnNobWFsbG93X2NpcmN1c19wZWFudXRfdGhpbmdzLCANCiAgICAgICAgIHRvYmxlcm9uZSA9IHRvbGJlcm9uZV9zb21ldGhpbmdfb3Jfb3RoZXIpDQogIA0KY2FuZHlfMjAxN19yZW5hbWVkDQpgYGANCg0KDQoNCkdldHRpbmcgYW4gaWRlYSBvZiBwZW9wbGUncyByZXNwb25zZXM6IA0KYGBge3J9DQoNCmRpc3RpbmN0KGNhbmR5XzIwMTVfcmVuYW1lZCwgYWdlKSANCiAgIyhjaHIpIDE0NiByZXNwb25zZXMsIHNvbWUgc2lsbHkgYW5kIHNvbWUgc3RyYW5nZQ0KZGlzdGluY3QoY2FuZHlfMjAxNV9yZW5hbWVkLCB0cmlja19vcl90cmVhdGluZykgDQogICMoY2hyKSB5ZXMgb3Igbm8gKE5BcyBpbiAyMDE3KQ0KZGlzdGluY3QoY2FuZHlfMjAxNV9yZW5hbWVkLCBzdGFyYnVyc3QpDQoNCg0KZGlzdGluY3QoY2FuZHlfMjAxNl9yZW5hbWVkLCBhZ2UpIA0KICAjIChjaHIpIDk4IGluY2wgc2lsbHkvc3RyYW5nZQ0KZGlzdGluY3QoY2FuZHlfMjAxNl9yZW5hbWVkLCB0cmlja19vcl90cmVhdGluZykgDQogICMoY2hyKSBZZXMgTm8gKE5BcyBpbiAyMDE3KQ0KZGlzdGluY3QoY2FuZHlfMjAxNl9yZW5hbWVkLCBnZW5kZXIpIA0KICAjIE1hbGUsIEZlbWFsZSwgT3RoZXIsIEknZCByYXRoZXIgbm90IHNheSwgTkENCmRpc3RpbmN0KGNhbmR5XzIwMTZfcmVuYW1lZCwgY291bnRyeSkgDQogICM5MyBzb21lIHNpbGx5LCBzb21lIGUuZy4gVVNBLCBVUywgdXMsIHUucy5hLiBldGMgDQpkaXN0aW5jdChjYW5keV8yMDE2X3JlbmFtZWQsIHN0YXJidXJzdCkNCg0KDQpkaXN0aW5jdChjYW5keV8yMDE3X3JlbmFtZWQsIGFnZSkgDQogICMoY2hyKSAxMDcgaW5jbCBzaWxseS9zdHJhbmdlDQpkaXN0aW5jdChjYW5keV8yMDE3X3JlbmFtZWQsIHRyaWNrX29yX3RyZWF0aW5nKQ0KICAjKGNocikgWWVzIE5vIGFuZCBOQQ0KZGlzdGluY3QoY2FuZHlfMjAxN19yZW5hbWVkLCBnZW5kZXIpIA0KICAjTWFsZSwgRmVtYWxlLCBPdGhlciwgSSdkIHJhdGhlciBub3Qgc2F5LCBOQQ0KZGlzdGluY3QoY2FuZHlfMjAxN19yZW5hbWVkLCBjb3VudHJ5KSANCiAgIzExOCBzb21lIHNpbGx5LCBzb21lIGUuZy4gVVNBLCBVUywgdXMsIHUucy5hLiBldGMgDQpkaXN0aW5jdChjYW5keV8yMDE3X3JlbmFtZWQsIHN0YXJidXJzdCkNCmBgYA0KDQoNCiMjIyMqKkpPSU5JTkcqKg0KDQpKb2luaW5nIGFsbCB0aHJlZSB5ZWFycyBieSBiaW5kaW5nIHJvd3Mgc28gYXMgdG8ga2VlcCBldmVyeXRoaW5nDQoNCmBgYHtyfQ0KYm91bmRfY2FuZHkgPC0gYmluZF9yb3dzKGNhbmR5XzIwMTVfcmVuYW1lZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgY2FuZHlfMjAxNl9yZW5hbWVkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBjYW5keV8yMDE3X3JlbmFtZWQpDQoNCmJvdW5kX2NhbmR5IDwtIGJvdW5kX2NhbmR5ICU+JSANCiAgcmVsb2NhdGUoY291bnRyeSwgLmJlZm9yZSA9IDUpICU+JSANCiAgcmVsb2NhdGUoc3RhdGVfb3JfcHJvdiwgLmJlZm9yZSA9IDYpICU+JSANCiAgcmVsb2NhdGUoZ2VuZGVyLCAuYmVmb3JlID0gNykNCg0KIyB2aWV3KGJvdW5kX2NhbmR5KQ0KYGBgDQoNCg0KIyMqKlFVRVNUSU9OUyoqDQood2l0aCBhZGRpdGlvbmFsIGNsZWFuaW5nIGluIGFtb25nc3QgbXkgYW5zd2VycykNCg0KDQojIyMjKipRVUVTVElPTiAxKiogDQoqKldoYXQgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBjYW5keSByYXRpbmdzIGdpdmVuIGFjcm9zcyB0aGUgdGhyZWUgeWVhcnMuKioNCioqKE51bWJlciBvZiBjYW5keSByYXRpbmdzLCBub3QgdGhlIG51bWJlciBvZiByYXRlcnMuIERvbuKAmXQgY291bnQgbWlzc2luZyB2YWx1ZXMpKioNCg0KKiBJIHJlbW92ZWQgdW5uZWNlc3NhcnkgY29sdW1ucyBhbmQgcGl2b3RlZCBsb25nZXIgYWxsIHRoZSBjYW5keSBjb2x1bW5zIHNvIHRoYXQgDQogIGVhY2ggcmF0aW5nIGNvdWxkIGJlIHNlZW4gYWxvbmdzaWRlIGl0J3MgZXF1aXZhbGVudCBjYW5keSBhbmQgdGhlbiBjYWxjdWxhdGVkDQogIHRoZSB0b3RhbCBudW1iZXINCg0KKipBTlNXRVIqKg0KVGhlIHRvdGFsIG51bWJlciBvZiBjYW5keSByYXRpbmdzIGFjcm9zcyB0aGUgdGhyZWUgeWVhcnMgd2FzIDU5MCwwMTAgcmF0aW5ncw0KDQpgYGB7cn0NCg0KdG90YWxfcmF0aW5ncyA8LSBib3VuZF9jYW5keSAlPiUgDQogIHNlbGVjdCgtYyh5ZWFyLCBpZF9udW1iZXIsIGFnZSwgDQogICAgICAgICAgICB0cmlja19vcl90cmVhdGluZywgY291bnRyeSwgDQogICAgICAgICAgICBzdGF0ZV9vcl9wcm92LCBnZW5kZXIpKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGJ1dHRlcmZpbmdlcjp0YWtlXzUsIA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiY2FuZHkiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJyYXRpbmciKSAlPiUgDQogIGZpbHRlcighaXMubmEocmF0aW5nKSkgJT4lIA0KICBjb3VudChuKCkpDQp0b3RhbF9yYXRpbmdzDQoNCmBgYA0KDQoNCg0KDQojIyMjKipBR0UgQ0xFQU5JTkcqKg0KDQpBZ2UgaXMgYSBjaGFyYWN0ZXIgY29sdW1uIHdpdGggMjc0IGRpc3RpbmN0IHZhbHVlcy4gVGhleSBhcmUgYSBtaXggb2YgbnVtYmVycywgTkFzLCANCmFuZCBzdHJhbmdlIGFuZCBzaWxseSB2YWx1ZXMuDQoqIEkgY2hhbmdlZCB0aGUgImFnZSIgY29sdW1uIHRvIGEgbnVtZXJpYyBidXQgaXQgb3V0cHV0IHN0cmFuZ2UgZmlndXJlcywgc28gSSANCiAgc3BlY2lmaWVkICJhcy5pbnRlZ2VyIiBhbmQgdGhlIHN0cmFuZ2UgYW5zd2VycyBiZWNhbWUgTkFzLiANCiogSXQgc2VlbXMgdW5saWtlbHkgdGhhdCBhbnlvbmUgb3ZlciAxMDAgeWVhcnMgb2xkIGlzIHRha2luZyBwYXJ0LCBzbyBJIHJlbW92ZWQgDQogIHRoZW0uDQoNCmBgYHtyfQ0KIyBib3VuZF9jYW5keSAlPiUgDQojICBkaXN0aW5jdChhZ2UpDQoNCmJvdW5kX2FnZV90b19udW1lcmljIDwtIGJvdW5kX2NhbmR5ICU+JSANCiAgbXV0YXRlKGFnZSA9IGFzLmludGVnZXIoYWdlKSkgJT4lIA0KICBhcnJhbmdlKGFnZSkNCg0KIyBib3VuZF9hZ2VfdG9fbnVtZXJpYyAlPiUgDQojIGRpc3RpbmN0KGFnZSkNCg0KYm91bmRfYWdlX2NsZWFuaW5nIDwtIGJvdW5kX2FnZV90b19udW1lcmljICU+JQ0KICBtdXRhdGUoYWdlID0gaWZfZWxzZShhZ2UgPiA5OSwgTkFfaW50ZWdlcl8sIGFnZSkpDQpib3VuZF9hZ2VfY2xlYW5pbmcNCiMgdmlldyhib3VuZF9hZ2VfY2xlYW5pbmcpDQpgYGANCg0KIyMjIyoqUVVFU1RJT04gVFdPKioNCioqV2hhdCB3YXMgdGhlIGF2ZXJhZ2UgYWdlIG9mIHBlb3BsZSB3aG8gYXJlIGdvaW5nIG91dCB0cmljayBvciB0cmVhdGluZz8qKg0KDQoqIEkgY2hlY2tlZCB0aGF0IHRoZSByZXNwb25zZXMgZm9yIHRyaWNrIG9yIHRyZWF0aW5nIGFyZSAiWWVzIiAiTm8gIiBhbmQgIk5BIi4NCiogU2VsZWN0aW5nIHRoZSBhcHByb3ByaWF0ZSBjb2x1bW5zLCBJIGdyb3VwZWQgdGhlbSBieSB3aGV0aGVyIGluZGl2aWR1YWxzIHdlcmUNCiAgdHJpY2sgb3IgdHJlYXRpbmcgb3Igbm90LCB0aGVuIGNhbGN1bGF0ZWQgdGhlIG1lYW4gYWdlIG9mIGVhY2ggcmVzcG9uc2UgZ2l2ZW4sIA0KICByb3VuZGluZyB0aGUgZmluYWwgdmFsdWUgdG8gYW4gYWdlIGluIHllYXJzLiANCiogQm90aCBhIHRpYmJsZSB3aXRoIHRoZSBhdmVyYWdlIG9mIGVhY2ggb2YgdGhlIHRocmVlIHJlc3BvbnNlcywgYW5kIG9uZSBvZiBqdXN0DQogIHRoZSBhdmVyYWdlIGFnZSBmb3IgdGhlIGFuc3dlciAiWWVzIiwgd2VyZSByZWNvcmRlZCBiZWxvdw0KDQoqKkFOU1dFUioqIA0KVGhlIChyb3VuZGVkKSBhdmVyYWdlIGFnZSBvZiB0aG9zZSBnb2luZyB0cmljayBvciB0cmVhdGluZyBpcyAzNSB5ZWFycyBvbGQgDQooMzQuOTQ4OTcgaXMgdGhlIHVuLXJvdW5kZWQgdmFsdWUpDQoNCmBgYHtyfQ0KIyBib3VuZF9hZ2VfY2xlYW5pbmcgJT4lIA0KIyAgIGRpc3RpbmN0KHRyaWNrX29yX3RyZWF0aW5nKQ0KDQpib3VuZF9hZ2VfY2xlYW5pbmcgJT4lIA0KICBzZWxlY3QoYWdlLCB0cmlja19vcl90cmVhdGluZykgJT4lIA0KICBncm91cF9ieSh0cmlja19vcl90cmVhdGluZykgJT4lIA0KICBzdW1tYXJpc2UoYXZlcmFnZV9hZ2UgPSByb3VuZChtZWFuKGFnZSwgbmEucm0gPSBUUlVFKSkpDQoNCiMgdG8ganVzdCBnZXQgdGhlIGFuc3dlciBmb3IgWWVzIG9uIGl0J3Mgb3duOiANCmJvdW5kX2FnZV9jbGVhbmluZyAlPiUgDQogIHNlbGVjdChhZ2UsIHRyaWNrX29yX3RyZWF0aW5nKSAlPiUgDQogIGdyb3VwX2J5KHRyaWNrX29yX3RyZWF0aW5nKSAlPiUgDQogIGZpbHRlcih0cmlja19vcl90cmVhdGluZyA9PSAiWWVzIikgJT4lIA0KICBzdW1tYXJpc2UoYXZlcmFnZV9hZ2UgPSByb3VuZChtZWFuKGFnZSwgbmEucm0gPSBUUlVFKSkpDQogICAgDQpgYGANCg0KIyMjIyoqUVVFU1RJT04gVEhSRUUqKg0KKipXaGF0IHdhcyB0aGUgYXZlcmFnZSBhZ2Ugb2YgcGVvcGxlIHdobyBhcmUgbm90IGdvaW5nIHRyaWNrIG9yIHRyZWF0aW5nPyoqDQoNCiogUmVwZWF0ZSBvZiBxdWVzdGlvbiB0d28sIGhvd2V2ZXIgZm9jdXNpbmcgb24gdGhlIGFuc3dlciAiTm8iIHRoYXQgd2FzIGdpdmVuIHdoZW4gDQogIGFza2VkLg0KDQoqKkFOU1dFUioqIA0KVGhlIChyb3VuZGVkKSBhdmVyYWdlIGFnZSBvZiB0aG9zZSBub3QgZ29pbmcgdHJpY2sgb3IgdHJlYXRpbmcgaXMgMzkgeWVhcnMgb2xkLiANCigzOS4xMDQ1NCBpcyB0aGUgdW5yb3VuZGVkIHZhbHVlKQ0KDQpgYGB7cn0NCmJvdW5kX2FnZV9jbGVhbmluZyAlPiUgDQogIHNlbGVjdChhZ2UsIHRyaWNrX29yX3RyZWF0aW5nKSAlPiUgDQogIGdyb3VwX2J5KHRyaWNrX29yX3RyZWF0aW5nKSAlPiUgDQogIHN1bW1hcmlzZShhdmVyYWdlX2FnZSA9IHJvdW5kKG1lYW4oYWdlLCBuYS5ybSA9IFRSVUUpKSkNCg0KIyB0byBqdXN0IGdldCB0aGUgYW5zd2VyIGZvciBObyBvbiBpdCdzIG93bjogDQpib3VuZF9hZ2VfY2xlYW5pbmcgJT4lIA0KICBzZWxlY3QoYWdlLCB0cmlja19vcl90cmVhdGluZykgJT4lIA0KICBncm91cF9ieSh0cmlja19vcl90cmVhdGluZykgJT4lIA0KICBmaWx0ZXIodHJpY2tfb3JfdHJlYXRpbmcgPT0gIk5vIikgJT4lIA0KICBzdW1tYXJpc2UoYXZlcmFnZV9hZ2UgPSByb3VuZChtZWFuKGFnZSwgbmEucm0gPSBUUlVFKSkpDQoNCmBgYA0KDQojIyMjKipRVUVTVElPTiBGT1VSKiogDQoqKkZvciBlYWNoIG9mIGpveSwgZGVzcGFpciBhbmQgbWVoLCB3aGljaCBjYW5keSBiYXIgcmV2aXZlZCB0aGUgbW9zdCBvZiB0aGVzZSoqIA0KKipyYXRpbmdzPyoqIA0KDQoqIEFzIGluIHF1ZXN0aW9uIDEsIGEgMiBjb2x1bW4gdGliYmxlIHdpdGggY2FuZHkgYW5kIHJhdGluZyB3YXMgY3JlYXRlZCBhbmQgYSBjb3VudA0Kb2YgZWFjaCBkaXN0aW5jdCBhbnN3ZXIgd2FzIG1hZGUgLSBmaXJzdGx5IGNvdW50aW5nIGVhY2ggZm9yIGVhY2ggcmVzcG9uc2UgYW5kIA0KZWFjaCBjYW5keSwgdGhlbiBmaWx0ZXJpbmcgdG8gZmluZCB0aGUgbWF4aW11bSBjb3VudCBmb3IgZWFjaCByYXRpbmcuIA0KDQoqKkFOU1dFUioqICANCiogRGVzcGFpcjogZ3VtIHRoYXQgY29tZXMgd2l0aCBiYXNlYmFsbCBjYXJkcyByZXR1cm5lZCB0aGUgbW9zdCBkZXNwYWlyIHJlc3BvbnNlcw0KICAgICAgICAgIHdpdGggNywzNDENCiogSm95OiBGdWxsIHNpemVkIGNhbmR5IGJhcnMgbWFkZSB0aGUgbW9zdCBwZW9wbGUgam95ZnVsIHdpdGggNyw1ODkgcmVzcG9uc2VzLg0KICAgIFRoaXMgc2VlbXMgdmVyeSBnZW5lcmljIHNvIEkgcmFuIGl0IGFnYWluIHRvIHJlbW92ZSB0aGUgZnVsbCBzaXplZCBjYW5keQ0KICAgIGJhcnMgYW5kIHRoZSB0b3AgSm95IHJlc3BvbnNlIHdhczogNzM2OSByZXNwb25zZXMgZm9yIHJlZXNlJ3MgcGVhbnV0IGJ1dHRlcg0KICAgIGN1cHMNCiogTWVoOiAxLDU3MCAiTWVoIiByZXNwb25zZXMgd2VyZSBnaXZlbiBmb3IgbG9sbGlwb3BzDQoNCg0KYGBge3J9DQoNCnJhdGVkX2NhbmR5IDwtIGJvdW5kX2NhbmR5ICU+JSANCiAgc2VsZWN0KC1jKHllYXIsIGlkX251bWJlciwgYWdlLCANCiAgICAgICAgICAgIHRyaWNrX29yX3RyZWF0aW5nLCBjb3VudHJ5LCANCiAgICAgICAgICAgIHN0YXRlX29yX3Byb3YsIGdlbmRlciwgDQogICAgICAgICAgICBhbnlfZnVsbF9zaXplZF9jYW5keV9iYXIpKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGJ1dHRlcmZpbmdlcjp0YWtlXzUsIA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiY2FuZHkiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJyYXRpbmciKQ0KcmF0ZWRfY2FuZHkNCg0KcmF0ZWRfY2FuZHkgJT4lIA0KICBncm91cF9ieShyYXRpbmcsIGNhbmR5KSAlPiUgDQogIHN1bW1hcmlzZShudW1iZXJfb2ZfcmF0aW5ncyA9IG4oKSkgJT4lIA0KICBmaWx0ZXIobnVtYmVyX29mX3JhdGluZ3MgPT0gbWF4KG51bWJlcl9vZl9yYXRpbmdzKSkNCg0KYGBgDQoNCiMjIyMqKlFVRVNUSU9OIEZJVkUqKg0KKipIb3cgbWFueSBwZW9wbGUgcmF0ZWQgU3RhcmJ1cnN0IGFzIGRlc3BhaXI/KioNCg0KKiBVc2luZyB0aGUgcGl2b3RlZCB0YWJsZSBvZiBjYW5keSBhbmQgdGhlaXIgcmF0aW5ncyBmcm9tIHByZXZpb3VzIHF1ZXN0aW9ucywgDQogIHRoZSB0b3RhbCBjb3VudCBjYW4gYmUgc2VlbiBiZWxvdw0KDQoqKkFOU1dFUioqIA0KMTk5MCBwZW9wbGUgdm90ZWQgZGVzcGFpciBmb3Igc3RhcmJ1cnN0cy4NCg0KYGBge3J9DQoNCnJhdGVkX2NhbmR5ICU+JSANCiAgZmlsdGVyKGNhbmR5ID09ICJzdGFyYnVyc3QiKSAlPiUgDQogIGdyb3VwX2J5KHJhdGluZykgJT4lIA0KICBzdW1tYXJpc2UocmF0aW5nX2NvdW50ID0gbigpKQ0KDQpgYGANCg0KDQoqKi0tLS0tLS0tLS1RVUVTVElPTlMgU0lYLCBTRVZFTiwgQU5EIEVJR0hUIEFGVEVSIENPVU5UUlkgQ0xFQU4tLS0tLS0tLS0tLS0tKioNCg0KIyMjIyoqQ09VTlRSWSBDTEVBTklORyoqIA0KDQpGaXJzdGx5IGdldHRpbmcgYW4gaWRlYSBvZiBOQXMgYW5kIGRpc3RpbmN0IGNvdW50cnkgdmFsdWVzOg0KDQoqIE5vdGUgdGhhdCB0aGUgeWVhciAyMDE1ICg1NjMwIHJvd3Mgb2YgOTM0OSkgaGFzIG5vIGNvdW50cnkgZGF0YS4gKGFsbCAiTkEiKQ0KKiA1NzE1IHJvd3MgaW4gYm91bmRfY2FuZHkgYXJlICJOQSINCiogVGhlcmUgYXJlIDE2OSBkaXN0aW5jdCBjb3VudHJ5IG5hbWVzIGluY2x1ZGluZyBOQXMsIG1pc3Mtc3BlbGxpbmdzLCBhbmQgc2lsbHkvIA0KIHVua25vd24gYW5zd2VycyANCg0KYGBge3J9DQpib3VuZF9jYW5keSAlPiUgDQogIGZpbHRlcihpcy5uYShjb3VudHJ5KSkNCg0KYm91bmRfY2FuZHkgJT4lIA0KICBkaXN0aW5jdChjb3VudHJ5KSANCmBgYA0KDQpVc2luZyBzdHJpbmdyIGFuZCByZWdleCB0byByZWR1Y2UgImNvdW50cnkiIHZhbHVlcw0KDQoqIFRoaXMgc3RhcnRlZCBvdXQgYSBsb3QgbG9uZ2VyLCBhbmQgSSBhbSBzdXJlIHRoZXJlIGFyZSBmYXN0ZXIvIGJldHRlciB3YXlzIG9mIA0KICBkb2luZyB0aGlzLCBidXQgSSB3YXMgcHJhY3RpY2luZyBkaWZmZXJlbnQgb3B0aW9ucyAoSWYgaXQgd2VyZSBzaG9ydGVyIC0gDQogIEkgYW0gbm90IHN1cmUgYWJvdXQgdGhlIGRpZmZpY3VsdGllcyB0aGF0IG1heSBhcmlzZSBpZiBvdGhlciBjb3VudHJpZXMgd2VyZSANCiAgYWRkZWQgYXQgYSBsYXRlciBkYXRlPykNCiAgDQoqIEZvciBjb2x1bW5zIHRoYXQgd2VyZSBudW1iZXJzLCBpbnB1dHMgbGlrZSAiTi4gQW1lcmljYSIsIG9yIGNsZWFybHkgZmFrZSANCiAgKHNpbGx5KSBhbnN3ZXJzLCBJIGNoZWNrZWQgdGhlIHN0YXRlIG9yIHByb3ZpbmNlIGNvbHVtbiB0byBzZWUgaWYgdGhlcmUgd2FzIGEgDQogIG1hdGNoIHRvIGEgY291bnRyeQ0KICANCiogSSBjaGVja2VkIG15IHdvcmsgb25lIHJvdyBhdCBhIHRpbWUgdG8gdHJ5IGFuZCBlbnN1cmUgSSBkaWQgbm90IGNoYW5nZSANCiAgYW55dGhpbmcgdGhhdCB3YXMgbm90IG1lYW50IHRvIGJlIGNoYW5nZWQuDQogIA0KKiBUcmllZCB0byBiZSBjYXJlZnVsIHdoZW4gY2hhbmdpbmcgbnVtYmVycyBhcyBzb21lID0gU3RhdGVzIGFjY29yZGluZyB0byB0aGVpciANCiAgc3RhdGUvcHJvdmluY2UgY29sdW1uIGFuZCBzb21lIGRvIG5vdCBlcXVhbCBhbnl0aGluZy4gDQoNCiogQWNjaWRlbnRhbGx5IGNoYW5nZWQgc29tZSB3b3JkcyBsaWtlIEEoYSl1c3RyYWxpYSB0byBBKGEpU3RhdGVzLCBhbmQgQXVzdHJpYSANCiAgdG8gU3RhdGVzYS4uLiB3aGljaCBpcyBvayBhcyBJIGFtIGp1c3QgaW5jbHVkaW5nIHRoZW0gYXMgIm90aGVyIHdvcmxkIg0KICANCiogVGhlcmUgYXJlIGlzc3VlcyB3aXRoICJTdGF0ZXNvZiBBIih0aGVyZSBhcmUgNCksICJ0aGUgYmVzdCBvbmUgLVN0YXRlcyIoMSksIA0KICAiVGhlU3RhdGVzIigyKSwgIlRoZSBTdGF0ZXMiICgxKSwgYW5kIGEgY291cGxlIG9mIG90aGVycyBidXQgYXMgdGhlcmUgYXJlIHNvIA0KICBmZXcgc28gSSBoYXZlIG1vdmVkIG9uDQogIA0KKiBDYXNjYWRpYSBpbmNsdWRlcyBDYW5hZGEgYW5kIFN0YXRlcyBzbyBJIGxlZnQgaXQgYXMgaXMNCg0KKiBVbml0ZWQgS2luZ2RvbSBpcyBpbmNsdXNpdmUgb2YgIkVuZGxhbmQiLCAiRW5nbGFuZCIsICJTY290bGFuZCIgYW5kIHZhcmlhdGlvbnMNCiAgb2YgIlVLIg0KICANCiogVGhvc2UgdW5kZXIgIklyZWxhbmQiIGFyZSBhbGwgaW4gdGhlIFJlcHVibGljDQoNCiogVGhlcmUgYXJlIHNvbWUgbW9yZSBub3RlcyBvbiBzcGVjaWZpYyBwaWVjZXMgb2YgY29kZSB3aXRoaW4gdGhlIGNvZGUgY2h1bmsNCg0KKiBWZWN0b3JzIHdlcmUgY3JlYXRlZCBmb3IgVW5rbm93biBjb3VudHJpZXMgYW5kIG90aGVyIGNvdW50cmllcyBvZiB0aGUgd29ybGQgdG8NCiAgY2hhbmdlIGFzIG1hbnkgYXQgb25jZS4gDQoNCmBgYHtyfQ0KYm91bmRfY291bnRyeV9jbGVhbiA8LSBib3VuZF9hZ2VfY2xlYW5pbmcgJT4lIA0KICBtdXRhdGUoY291bnRyeSA9IHN0cl9yZXBsYWNlX2FsbChjb3VudHJ5LCBwYXR0ZXJuID0gIlswLTldWzAtOV1bLl1bMC05XSIsICJTdGF0ZXMiKSwNCiAgICAgICAgIGNvdW50cnkgPSBzdHJfcmVwbGFjZV9hbGwoY291bnRyeSwgcGF0dGVybiA9ICJbM3w0fDVdWzAtOV0iLCAiU3RhdGVzIiksDQogICAgICAgICBjb3VudHJ5ID0gc3RyX3JlcGxhY2VfYWxsKGNvdW50cnksIHBhdHRlcm4gPSAiW3VVXVthLXpBLVouXSogW3NTXVthLXpBLVpdKiBbb09dW2ZGXSBbQWFdKlthLXpBLVpdKiIsICJTdGF0ZXMiKSwNCiAgICAgICAgIGNvdW50cnkgPSBzdHJfcmVwbGFjZV9hbGwoY291bnRyeSwgcGF0dGVybiA9ICJbIC5dKlt1VV0rW2EtekEtWi5dKiBbc1NdK1thLXpBLVpdKlsgLl0qIiwgIlN0YXRlcyIpLA0KICAgICAgICAgY291bnRyeSA9IHN0cl9yZXBsYWNlX2FsbChjb3VudHJ5LCBwYXR0ZXJuID0gIlsgXSpbdVVdK1sgLiFdKltzU10rWyAuIV0qW2FBXSpbIC4hXSoiLCAiU3RhdGVzIiksDQogICAgICAgICAjIHRoZSBhYm92ZSBjaGFuZ2VzIGF1c3RyaWEgYW5kIGF1c3RyYWxpYSAtIHdhdGNoIG91dCENCiAgICAgICAgIGNvdW50cnkgPSBzdHJfcmVwbGFjZV9hbGwoY291bnRyeSwgcGF0dGVybiA9ICJbdVVdK1tuTl0rW2Etel0qIFtzU10rW3RUXVthQV1bdFRdW2Etel0qIFtvT10rW2ZGXSBbYUFdW21NXVthLXpdKlx0KiIsICJTdGF0ZXMiKSwNCiAgICAgICAgICMgdGhlcmUncyBzdGlsbCBvbiAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiB3aGljaCB3b24ndCBnbyAtIHNwYWNlcz8NCiAgICAgICAgIGNvdW50cnkgPSBzdHJfcmVwbGFjZV9hbGwoY291bnRyeSwgcGF0dGVybiA9ICJeW21NXVt1VXxlRV1bclJdK1tpSV1bY0N8a0tdW2FBXSIsICJTdGF0ZXMiKSwNCiAgICAgICAgY291bnRyeSA9IHN0cl9yZXBsYWNlX2FsbChjb3VudHJ5LCBwYXR0ZXJuID0gIl5bYUFdW21NXVtlRV1bclJdW2lJXVtjQ11bYUFdIiwgIlN0YXRlcyIpLA0KICAgICAgICBjb3VudHJ5ID0gc3RyX3JlcGxhY2VfYWxsKGNvdW50cnksIHBhdHRlcm4gPSAiXlxcJ1ttTV1bdVV8ZUVdW3JSXVtpSV1bY0NdW2FBXSIsICJTdGF0ZXMiKSwNCiAgICAgICAgY291bnRyeSA9IHN0cl9yZXBsYWNlX2FsbChjb3VudHJ5LCBwYXR0ZXJuID0gIltUdGhlXSpbIF0qW3NTXStbdFRdW2FBXVt0VF1bYS16XSpbU3NdW3RUXVthLXpdKltTc10qW3RUXSpbYS16XSpbU3NdKlt0VF0qW2Etel0qIiwgIlN0YXRlcyIpLA0KICAgICAgICAgICMgcmVtb3ZpbmcgU3RhdGVzIHJlcGVhdGVkDQogICAgICAgIGNvdW50cnkgPSBzdHJfcmVwbGFjZV9hbGwoY291bnRyeSwgcGF0dGVybiA9ICJbVHRdW2Etel0qIFtiQl1bYS16XSogW2EtekEtWl0rIFstXSsgW3VVXVtzU11bYUFdIiwgIlN0YXRlcyIpLA0KICAgICAgICAjIHRoaXMgd2FzIGFuIGF0dGVtcHQgYXQgInRoZSBiZXN0IG9uZSAtIFVTQSINCiAgICAgICAgY291bnRyeSA9IHN0cl9yZXBsYWNlX2FsbChjb3VudHJ5LCBwYXR0ZXJuID0gIltuTl1bYS16XSsgW2NDfHlZfGpKXStbYS16XSp8W3BQfHRUXStbaUl8clJdK1t0VHx1VV0rW2Etel0rfFtjQ11bYUFdW2xMXVtpSV1bYS16XSp8W2FBXVtsTF1bYUFdW2Etel0qIiwgIlN0YXRlcyIpLA0KICAgICAgICAjIFRoZSBhYm92ZSBpcyBmb3IgIk5ldyBZb3JrLCBOb3J0aCBDYXJvbGluYSwgTmV3IEplcnNleSwgUGl0dHNidXJnaCwgVHJ1bXBpc3RhbiwgQ2FsaWZvcm5pYSwgYW5kIEFsYXNrYSAoaXQgYWxzbyBjaGFuZ2VkIHRoZSBlbmQgb2YgTmV3IFplYWxhbmQgdG8gTmV3IFplc3RhdGVzLi4uKQ0KICAgICAgICBjb3VudHJ5ID0gc3RyX3JlcGxhY2VfYWxsKGNvdW50cnksIHBhdHRlcm4gPSAiQWhlbS4uLi5BbWVyY2EiLCAiU3RhdGVzIiksDQogICAgICAgIGNvdW50cnkgPSBzdHJfcmVwbGFjZV9hbGwoY291bnRyeSwgcGF0dGVybiA9ICJeW2NDXStbYUFdK1tuTl0rW2FBXStbZER8ZUVdK1thQV0qW2FBfGlJfHJSXSpbYUF8bk5dKltpSV0qW2FBXSpbYF0qfFtzXVtvXVt2XVthLXpdKiBbY0NdW2Etel0qIiwgIkNhbmFkYSIpLA0KICAgICAgICBjb3VudHJ5ID0gc3RyX3JlcGxhY2VfYWxsKGNvdW50cnksIHBhdHRlcm4gPSAiXltlRV0rW25OXStbYS16QS1aXSp8XltzU10rW2NDXStbYS16QS1aXSp8W3VVXStbbk5dK1thLXpBLVpdKiBba0tdK1thLXpBLVpdKiIsICJVbml0ZWQgS2luZ2RvbSIpLA0KICAgICAgICBjb3VudHJ5ID0gc3RyX3JlcGxhY2VfYWxsKGNvdW50cnksIHBhdHRlcm4gPSAiXltlRV0rW25OXStbYS16QS1aXSp8XltzU10rW2NDXStbYS16QS1aXSp8W3VVXStbbk5dK1thLXpBLVpdKiBba0tdK1suXSpbYS16QS1aXSp8W3VVXStbLl0qW2tLXStbLl0qIiwgIlVuaXRlZCBLaW5nZG9tIikNCiAgICAgICAgICAgICAgICAgICkNCg0KYm91bmRfY291bnRyeV9jbGVhbiAlPiUgDQogIGRpc3RpbmN0KGNvdW50cnkpDQoNCiMgdmlldyhib3VuZF9jb3VudHJ5X2NsZWFuKQ0KYGBgDQoNCkNyZWF0aW5nIHRoZSAib3RoZXIiIHZlY3RvcnMgYW5kIGpvaW5pbmcgdGhlbSB0byB0aGUgZGF0YSANCg0KYGBge3J9DQpyZXN0X29mX3RoZV93b3JsZCA8LSBjKCJHZXJtYW55IiwgImdlcm1hbnkiLCAiQVN0YXRlcyIsICJhU3RhdGVzIiwgIlN0YXRlc2EiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkphcGFuIiwgIk1leGljbyIsICJOZXRoZXJsYW5kcyIsICJuZXRoZXJsYW5kcyIsICJUaGUgTmV0aGVybGFuZHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAiU3dlZGVuIiwgIkJlbGdpdW0iLCAiSXJlbGFuZCIsICJOZXcgWmVTdGF0ZXMiLCAiU3dpdHplcmxhbmQiLA0KICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbmEiLCAiRnJhbmNlIiwgImZyYW5jZSIsICJEZW5tYXJrIiwgIktvcmVhIiwgIlNvdXRoIEtvcmVhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIkJyYXNpbCIsICJjYXNjYWRpYSIsICJDYXNjYWRpYSIsICJDb3N0YSBSaWNhIiwgImNyb2F0aWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgImVzcGHDsWEiLCAic3BhaW4iLCAiU291dGggYWZyaWNhIiwgIkV1cm9wZSIsICJGaW5sYW5kIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJmaW5sYW5kIiwgIkdyZWVjZSIsICJob25nIGtvbmciLCAiSG9uZyBLb25nIiwgImh1bmdhcnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAiSWNlbGFuZCIsICJJbmRvbmVzaWEiLCAia2VueWEiLCAiTm90IHRoZVN0YXRlc29yIENhbmFkYSIsDQogICAgICAgICAgICAgICAgICAgICAgICJQYW5hbWEiLCAiUGhpbGlwcGluZXMiLCAiUG9ydHVnYWwiLCAiU2luZ2Fwb3JlIiwgInN3ZWRlbiIsDQogICAgICAgICAgICAgICAgICAgICAgICJUYWl3YW4iLCAiVUFFIikNCg0KdW5rbm93bl9jb3VudHJ5IDwtIGMoIkNhbiIsICJTdGF0ZXNvZiBBIiwiU3ViLUNhbmFkaWFuIE5vcnRoIEFtZXJpY2EuLi4iLCAiJ01lcmljYSIsDQogICAgICAgICAgICAgICAgICAgICAiVGhlU3RhdGVzIiwgIjEiLCAiQSIsICJBIHRyb3BpY2FsIGlzbGFuZCBzb3V0aCBvZiB0aGUgZXF1YXRvciIsIA0KICAgICAgICAgICAgICAgICAgICAgIkF0bGFudGlzIiwgIkRlbmlhbCIsICJFYXJ0aCIsICJFVUEiLCAiRmVhciBhbmQgTG9hdGhpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICJJIGRvbid0IGtub3cgYW55bW9yZSIsICJnb2QncyBjb3VudHJ5IiwgImluc2FuaXR5IGxhdGVseSIsIA0KICAgICAgICAgICAgICAgICAgICAgIk4uIEFtZXJpY2EiLCAiSSBwcmV0ZW5kIHRvIGJlIGZyb20gQ2FuYWRhLCBidXQgSSBhbSByZWFsbHkgDQogICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZVN0YXRlcyIsICJOYXJuaWEiLCAiTmV2ZXJsYW5kIiwgIm9uZSBvZiB0aGUgYmVzdCBvbmVzIiwNCiAgICAgICAgICAgICAgICAgICAgICJTZWUgYWJvdmUiLCAiU29tZXdoZXJlIiwgIlN0YXRlcyhJIHRoaW5rIGJ1dCBpdCdzIGFuIGVsZWN0aW9uIA0KICAgICAgICAgICAgICAgICAgICAgeWVhciBzbyB3aG8gY2FuIHJlYWxseSB0ZWxsKSIsICJTdGF0ZXM/IEhhcmQgdG8gdGVsbCBhbnltb3JlLiIsDQogICAgICAgICAgICAgICAgICAgICAiU3RhdGVzcyIsICJzdWJzY3JpYmUgdG8gZG00dXozIG9uIHlvdXR1YmUiLCAidGhlIGJlc3Qgb25lIC1TdGF0ZXMiLA0KICAgICAgICAgICAgICAgICAgICAgIlRoZSByZXB1YmxpYyBvZiBDYXNjYWRpYSIsICJUaGUgU3RhdGVzIiwgIlRoZSBZb28gRXNzIG9mIEFhYXl5eXl5eSIsDQogICAgICAgICAgICAgICAgICAgICAidGhlcmUgaXNuJ3Qgb25lIGZvciBvbGQgbWVuIiwgInRoaXMgb25lIiwgIlVEIiwgDQogICAgICAgICAgICAgICAgICAgICAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIikNCg0KY2FuZHlfY2xlYW5lZCA8LSBib3VuZF9jb3VudHJ5X2NsZWFuICU+JSANCiAgbXV0YXRlKGNvdW50cnkgPSBpZl9lbHNlKGNvdW50cnkgJWluJSByZXN0X29mX3RoZV93b3JsZCwgIk90aGVyIiwgY291bnRyeSksDQogICAgICAgICBjb3VudHJ5ID0gaWZfZWxzZShjb3VudHJ5ICVpbiUgdW5rbm93bl9jb3VudHJ5LCBhcy5jaGFyYWN0ZXIoTkEpLCBjb3VudHJ5KSkNCg0KY2FuZHlfY2xlYW5lZCAlPiUgDQogIGRpc3RpbmN0KGNvdW50cnkpDQojIHN0aWxsIGhhdmUgMTEgZGlmZmVyZW50ICJjb3VudHJpZXMiDQpgYGANCg0KIA0KIA0KKipGb3IgdGhlIG5leHQgdGhyZWUgcXVlc3Rpb25zLCBjb3VudCBkZXNwYWlyIGFzIC0xLCBqb3kgYXMgKzEsIGFuZCBtZWggYXMgMC4qKg0KIA0KLSBOZWVkaW5nIHRvIHBpdm90IGFnYWluIHNvIGNhbiBjcmVhdGUgYSBuZXcgY29sdW1uIHdpdGggcmF0aW5ncyBhcyBudW1iZXJzDQotIEkgY291bGRuJ3QgcXVpdGUgZ2V0IGlmX2Vsc2UgdG8gd29yayBzbyB3ZW50IHdpdGggY2FzZV93aGVuIGFuZCB0dXJuZWQgdGhlIA0KICBjb2x1bW4gbnVtZXJpYyANCg0KYGBge3J9DQpjYW5keV9waXZvdF9yYXRpbmdzIDwtIGNhbmR5X2NsZWFuZWQgJT4lIA0KICBzZWxlY3QoLWMoaWRfbnVtYmVyLCANCiAgICAgICAgICAgIGFnZSwgDQogICAgICAgICAgICB0cmlja19vcl90cmVhdGluZywgDQogICAgICAgICAgICBzdGF0ZV9vcl9wcm92KSkgJT4lIA0KICBwaXZvdF9sb25nZXIoYnV0dGVyZmluZ2VyOnRha2VfNSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJjYW5keSIsIA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInJhdGluZyIpICU+JSANCiAgbXV0YXRlKHJhdGluZ3NfbnVtZXJpYyA9IGNhc2Vfd2hlbihyYXRpbmcgPT0gIkpPWSIgfiAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpbmcgPT0gIkRFU1BBSVIiIH4gLTEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW5nID09ICJNRUgiIH4gMCkNCiAgICAgICAgICkNCmNhbmR5X3Bpdm90X3JhdGluZ3MNCmBgYA0KDQoNCiMjIyMqKlFVRVNUSU9OIFNJWCoqIA0KKipXaGF0IHdhcyB0aGUgbW9zdCBwb3B1bGFyIGNhbmR5IGJhciBieSB0aGlzIHJhdGluZyBzeXN0ZW0gZm9yIGVhY2ggZ2VuZGVyIGluKioNCioqdGhlIGRhdGFzZXQ/KioNCg0KKiBJIGZpcnN0IGxvb2tlZCBhdCB0aGUgRmVtYWxlcyAodGhlcmUgYXJlOiBGZW1hbGVzLCBNYWxlcywgT3RoZXIsIGFuZCBJJ2QgcmF0aGVyDQogIG5vdCBzYXkpIGFuZCBncm91cGVkIHRoZW0gYnkgY2FuZHkuIA0KKiBJIHRyaWVkIHRvIGZpbmQgdGhlIHN1bSBvZiB0aGUgbnVtZXJpYyByYXRpbmdzIGJ1dCB0aGlzIGdhdmUgbWUgTkEgdmFsdWVzIGZvcg0KICBldmVyeXRoaW5nLiANCiogU28gSSBkZWNpZGVkIHRvIGNvbXBhcmUgdGhlIG1lYW4gc2NvcmUgZm9yIGVhY2ggY2FuZHkuIA0KKiBSZXBlYXRlZCB0aGUgcHJvY2VzcyBmb3IgZWFjaCBvZiB0aGUgb3RoZXIgMyBjYXRlZ29yaWVzIG9mIGdlbmRlciB3aXRoIGdyb3VwX2J5DQogIGdlbmRlciAoSSBjb3VsZCBub3Qgc2VlbSB0byBncm91cCBieSBnZW5kZXIgZWFybGllcikNCiAgDQoqKkFOU1dFUioqDQpUaGUgbW9zdCBwb3B1bGFyIGNhbmR5IGJhciBmb3IgYWxsIGZvdXIgZ3JvdXBzIHdhcyAiYW55IGZ1bGwgc2l6ZWQgY2FuZHkgYmFyIi4gDQpCdXQsIGFzIGRlY2lkZWQgaW4gYSBwcmV2aW91cyBxdWVzdGlvbiwgdGhpcyBzZWVtcyB0b28gZ2VuZXJpYyBzbyBJIHdvdWxkIHN1Z2dlc3QNCnRoZSBmb2xsb3dpbmcgdG9wIHJlc3VsdHM6DQoqICJGZW1hbGUiOiBSZWVzZSdzIFBlYW51dCBCdXR0ZXIgQ3Vwcy4NCiogIk1hbGUiOiAgYWxzbyBSZWVzZSdzIFBlYW51dCBCdXR0ZXIgQ3Vwcy4NCiogIk90aGVyIjogVHdpeA0KKiAiSSdkIHJhdGhlciBub3Qgc2F5IjogS2l0LUthdA0KYGBge3J9DQoNCmNhbmR5X3Bpdm90X3JhdGluZ3MgJT4lIA0KICBmaWx0ZXIoZ2VuZGVyID09ICJGZW1hbGUiKSAlPiUgDQogIGdyb3VwX2J5KGNhbmR5KSAlPiUgDQogIHN1bW1hcmlzZShyYXRpbmdfY291bnQgPSBtZWFuKHJhdGluZ3NfbnVtZXJpYywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmF0aW5nX2NvdW50KSkgDQoNCg0KY2FuZHlfcGl2b3RfcmF0aW5ncyAlPiUgDQogIGdyb3VwX2J5KGdlbmRlciwgY2FuZHkpICU+JSANCiAgc3VtbWFyaXNlKHJhdGluZ19jb3VudCA9IG1lYW4ocmF0aW5nc19udW1lcmljLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhyYXRpbmdfY291bnQpKSANCg0KYGBgDQoNCiMjIyMqKlFVRVNUSU9OIFNFVkVOKiogDQoqKldoYXQgd2FzIHRoZSBtb3N0IHBvcHVsYXIgY2FuZHkgYmFyIGluIGVhY2ggeWVhcj8qKg0KDQoqIFNpbWlsYXIgdG8gcXVlc3Rpb25zIHNpeCwgdGhlIGRhdGEgd2FzIGdyb3VwZWQgYnkgInllYXIiIGFuZCBieSAiY2FuZHkiIGJlZm9yZQ0KICBmaW5kaW5nIHRoZSB0b3AgYXZlcmFnZSBzY29yZSBmb3IgZWFjaCB5ZWFyLiANCiAgDQoqKkFOU1dFUioqDQoqIEFnYWluLCB0aGUgc2FtZSAiZnVsbCBzaXplZCBjYW5keSBiYXIiIGFyZ3VlbWVudCByZTogaXQncyB0b28gZ2VuZXJpYyBtZWFucyB0aGF0DQogIHRoZSBtb3N0IHBvcHVsYXIgY2FuZHkgYmFyIGluIGVhY2ggeWVhciB3YXM6DQogICogMjAxNTogUmVlc2UncyBQZWFudXQgQnV0dGVyIEN1cHMuDQogICogMjAxNjogS2l0LUthdC4NCiAgKiAyMDE3OiBSZWVzZSdzIFBlYW51dCBCdXR0ZXIgQ3Vwcy4NCg0KYGBge3J9DQoNCmNhbmR5X3Bpdm90X3JhdGluZ3MgJT4lIA0KICBncm91cF9ieSh5ZWFyLCBjYW5keSkgJT4lIA0KICBzdW1tYXJpc2UocmF0aW5nX2NvdW50ID0gbWVhbihyYXRpbmdzX251bWVyaWMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgYXJyYW5nZShkZXNjKHJhdGluZ19jb3VudCkpDQogIA0KYGBgDQoNCg0KIyMjIyoqUVVFU1RJT04gRUlHSFQqKiANCioqV2hhdCB3YXMgdGhlIG1vc3QgcG9wdWxhciBjYW5keSBiYXIgYnkgdGhpcyByYXRpbmcgZm9yIHBlb3BsZSBpbiBVUywgQ2FuYWRhLCoqIA0KKipVSywgYW5kIGFsbCBvdGhlciBjb3VudHJpZXM/KioNCg0KKiBDbGVhbmluZyBvZiBjb3VudHJ5IGRhdGEgYXMgZGVzY3JpYmVkIGFib3ZlDQoqIFNpbWlsYXIgdG8gcXVlc3Rpb25zIHNpeCBhbmQgc2V2ZW4sIGRhdGEgd2FzIGdyb3VwZWQgYnkgY2FuZHkgKGhvd2V2ZXIsIGFnYWluDQogIGl0IHdvdWxkbid0IGZpbHRlciBuaWNlbHkgc28gSSBmaWx0ZXJlZCBieSBlYWNoIG9mIHRoZSBjb3VudHJpZXMgaW4gcXVlc3Rpb24gDQogIGZpcnN0KS4NCiogVGhlIG1lYW4gdmFsdWUgZm9yIGVhY2ggY2FuZHkgd2FzIHRoZW4gY2FsY3VsYXRlZCANCg0KKipBTlNXRVIqKg0KIkFueSBmdWxsIHNpemVkIGNhbmR5IGJhciIgd2FzIGlnbm9yZWQgYWdhaW4gZHVlIHRvIGJlaW5nIHRvbyBnZW5lcmljLCB0aGVyZWZvcmUNCmVhY2ggY291bnRyaWVzIG1vc3QgcG9wdWxhciBjYW5keSB3YXM6IA0KDQpVbml0ZWQgU3RhdGVzOiBSZWVzZSdzIHBlYW51dCBidXR0ZXIgY3Vwcw0KQ2FuYWRhOiBLaXQtS2F0DQpVSzogUm9sb3MNClRoZSByZXN0IG9mIHRoZSB3b3JsZDogS2l0LUthdA0KDQpgYGB7cn0NCg0KY2FuZHlfcGl2b3RfcmF0aW5ncyAlPiUgDQogIGZpbHRlcihjb3VudHJ5ID09ICJTdGF0ZXMiKSAlPiUgDQogIGdyb3VwX2J5KGNhbmR5KSAlPiUNCiAgc3VtbWFyaXNlKHJhdGluZ19jb3VudCA9IG1lYW4ocmF0aW5nc19udW1lcmljLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhyYXRpbmdfY291bnQpKQ0KDQpjYW5keV9waXZvdF9yYXRpbmdzICU+JSANCiAgZmlsdGVyKGNvdW50cnkgPT0gIkNhbmFkYSIpICU+JSANCiAgZ3JvdXBfYnkoY2FuZHkpICU+JQ0KICBzdW1tYXJpc2UocmF0aW5nX2NvdW50ID0gbWVhbihyYXRpbmdzX251bWVyaWMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgYXJyYW5nZShkZXNjKHJhdGluZ19jb3VudCkpDQoNCmNhbmR5X3Bpdm90X3JhdGluZ3MgJT4lIA0KICBmaWx0ZXIoY291bnRyeSA9PSAiVW5pdGVkIEtpbmdkb20iKSAlPiUgDQogIGdyb3VwX2J5KGNhbmR5KSAlPiUNCiAgc3VtbWFyaXNlKHJhdGluZ19jb3VudCA9IG1lYW4ocmF0aW5nc19udW1lcmljLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhyYXRpbmdfY291bnQpKQ0KDQpjYW5keV9waXZvdF9yYXRpbmdzICU+JSANCiAgZmlsdGVyKGNvdW50cnkgPT0gIk90aGVyIikgJT4lIA0KICBncm91cF9ieShjYW5keSkgJT4lDQogIHN1bW1hcmlzZShyYXRpbmdfY291bnQgPSBtZWFuKHJhdGluZ3NfbnVtZXJpYywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmF0aW5nX2NvdW50KSkNCmBgYA0KDQogIA==